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

Why using ASYNC - AWAIT in task factory?

我是新手,需要帮助。 我有一个网络服务,

此服务将停止所有任务并每 30 分钟重新启动一次。

Q1= Is that regular code sample ?

Q2= This code works for me, but do i need ASYNC AWAIT in this project ? i'm using .net 4.0.

谢谢。

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) { }
    }
}

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

您应该在网络服务中使用 async/await 关键字吗?不一定,因为一旦任务完成,您似乎并没有真正从能够捕获上下文并执行方法的其余部分中受益。您的 Start 方法只触发 3 个任务和 return 而无需等待任何任务完成。所以这个方法并不是真正的 "awaitable" 或者本质上是异步的。

如果你想让它异步,你 可以 在你的 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 关键字时,编译器基本上会为您生成一个状态机。异步方法的开始就像任何其他方法一样执行,当它遇到 "await" 关键字时,它从方法中 returns 并告诉等待(即异步操作)到 运行 方法的其余部分一旦完成。请参考以下link以获取更多相关信息。

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