【发布时间】:2014-01-16 13:28:00
【问题描述】:
假设我有这个简单的 sn-p:
async void button_Click(object sender, RoutedEventArgs e)
{
await Task.Factory.StartNew(() =>
{
Console.WriteLine("start");
Thread.Sleep(5000);
Console.WriteLine("end");
});
}
显然,每次我按下该按钮时,都会启动一个新任务,即使之前的任务仍在运行。我将如何推迟任何新任务,直到所有以前的任务都完成?
更多细节:
在上面的示例中,每个新任务都与之前的任务相同。但是,在原始上下文中,任务顺序很重要:参数可能会改变(我可以使用DateTime.Now.Ticks“模拟”它)。
任务应该按照它们“注册”的顺序执行。具体来说,我的程序将与串行设备通信。我之前使用BlockingCollection 的后台线程完成了此操作。但是,这次有一个严格的请求/响应协议,如果可能的话,我想使用 async/await。
可能的解决方案:
我可以想象创建任务并将它们存储在一个列表中。但是我将如何执行与需求相关的任务?还是应该回到我之前使用过的基于线程的解决方案?
【问题讨论】:
-
您仍然可以使用
ConcurrentQueue或BlockingCollection。既然是生产者-消费者场景,后者应该是最合适的。 -
当然。但正如我所见,我需要在队列中等待并循环它。我会存储
Tasks 或数据来创建任务吗?我会在Task内循环队列还是循环启动Task?不过,这不是什么大问题,但我希望有另一种更适合该请求/响应模式的方法。
标签: c# asynchronous async-await