为什么在任务工厂中使用ASYNC-AWAIT?

时间:2016-12-23 12:42:24

标签: c# windows-services async-await task

我是新任务工作,需要帮​​助。 我有一个网络服务,

此服务将停止所有任务,并每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) { }
    }
}

1 个答案:

答案 0 :(得分:1)

您真的需要使用async / await关键字来启动和停止任务吗?否。

您是否应该在Web服务中使用async / await关键字?不一定是因为一旦任务完成,你不能从捕获上下文并执行方法的其余部分中获益太多。您的Start方法只会触发3个任务并返回,而无需等待任何任务完成。所以这种方法真的不会等待#34;或本质上是异步的。

可以在你的Stop方法中使用async / await关键字,如果你想使它异步,即你希望这个方法的任何调用者能够异步调用它并做一些事情一旦任务实际停止:

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

使用async和await关键字时,编译器基本上会为您生成状态机。异步方法的开始就像任何其他方法一样执行,当它遇到&#34; await&#34;从方法返回的关键字,告诉等待(即异步操作)在完成后运行方法的其余部分。有关此内容的更多信息,请参阅以下链接。

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