2016-12-23 5 views
0

i m новый в задачах задания и должен помочь. У меня есть веб-сервис,Зачем использовать ASYNC - AWAIT на фабрике задач?

Эта услуга остановит все задачи и начнется заново каждые 30 минут.

Q1 = Это обычный образец кода?

Q2 = Этот код работает для меня, но мне нужен ASYNC AWAIT в этом проекте ? Я использую .net 4.0.

Thx.

private CancellationTokenSource tokenSource; 
private List<Task> Tasks; 
public virtual void Start() 
{ 
    // start 
    Tasks = new List<Task>(); 
    tokenSource = new CancellationTokenSource(); 
    for (int i = 0; i < 3; i++) 
    { 
     Tasks.Add(Task.Factory.StartNew(() => SomeWork(), 
       tokenSource.Token, 
       TaskCreationOptions.LongRunning, 
       TaskScheduler.Default)); 
    } 
} 

public void Stop() 
{ 
    tokenSource.Cancel(); 
    Task.Factory.ContinueWhenAll(Tasks.ToArray(), t => 
    { 
     Console.WriteLine("all finished"); 
     // start again 
     Start(); 
    }); 
} 

int i = 0; 
public void SomeWork() 
{ 
    while (!tokenSource.IsCancellationRequested) 
    { 
     try 
     { 
      Thread.Sleep(1000 * 4); 
      Console.WriteLine(Task.CurrentId + " finised!"); 
     } 
     catch (Exception) { } 
    } 
} 
+0

Вам не нужно использовать асинхронный/Await - на самом деле, вы не можете использовать асинхронный/Await с .Net 4, так что вопрос спорный. –

+0

Я знаю, что async/await можно использовать в .net 4.0 в некотором роде, но вопрос действительно мне нужен, я действительно не знаю – Mennan

+0

Да, вам не нужно * использовать его; это просто способ упростить асинхронное программирование. Я предполагаю, что 'Thread.Sleep (1000 * 4);' является всего лишь способом эмуляции некоторого кода, который нельзя отменить на несколько секунд. –

ответ

1

Вам действительно нужно использовать ключевые слова async/wait, чтобы иметь возможность запускать и останавливать задачу? №

Должны ли вы использовать ключевые слова async/wait в своем веб-сервисе? Не обязательно потому, что вы, по-видимому, не очень выигрываете от возможности захвата контекста и выполнения оставшейся части метода после завершения задачи. Ваш метод Start просто запускает 3 задачи и возвращается, не дожидаясь завершения каких-либо задач. Таким образом, этот метод не является действительно «ожидаемым» или асинхронным по своей природе.

Вам может воспользовались Асинхронный/ждут ключевых слов в вашем методе Stop, если вы хотите сделать это асинхронно, то есть вы хотите любой вызов этого метода иметь возможность вызвать его асинхронно и сделать что-то когда-то задачи есть на самом деле был остановлен:

public async Task StopAsync() 
{ 
    tokenSource.Cancel(); 
    await Task.WhenAll(Tasks.ToArray()); 
    Console.WriteLine("all finished"); 
    Start(); 
} 


await StopAsync(); 
//now all tasks have been stopped...do something 

При использовании асинхр и ждут ключевые слова компилятор в основном формирует государственную машину для вас. Начало асинхронного метода выполняется так же, как и любой другой метод, и когда оно попадает в ключевое слово «ожидание», оно возвращается из метода и сообщает ожидаемому (это асинхронная операция) выполнение оставшейся части метода после его завершения. Для получения дополнительной информации об этом обратитесь к следующей ссылке.

How and When to use `async` and `await`

+0

thx для ответа ур, я думаю, что я не использую async, поэтому его лишний в этом примере – Mennan