Meh*_*rad 5 .net c# multithreading asynchronous async-await
实现执行异步 的无限运行任务的正确方法是什么BigJob()
?并可根据要求停止
提示:我正在尝试学习[a]新方法来更新我现有的策略.
我有这个简单的程序(测试人员),它有一个开始和停止按钮.
当按下Start时,我正在启动测试仪,它将查找并测试范围内的可用设备,并在无限量的轮次中测试我们的地狱,直到用户按下Stop按钮.
重要的是,主进程/ action/bigJob()是和awaitble 异步进程.
所以我会伪装整个事情
Start
Round 1 starts
Async Main job starts
Async connect
Async Read
Async Write
Async disconnect
Nobody cancelled me yet
Round 1 finishes
Round 2 starts
.
.
.
Round 2 finishes
Round 3 starts
.
Stop pressed, hence break out.
Stop
Run Code Online (Sandbox Code Playgroud)
所以我使用BackgroundWorker
来实现无限循环,并Async/Await
为连接,读,写和断开,我已经写在C#
下面.Net 4.5
由于我的子任务,如Connect和.etc,async
然后我的主要任务是async
按下停止按钮停止我的过程,因为它消除了while
我拥有的无限循环
while (!bw.CancellationPending)
{
await MainTask();
...
}
Run Code Online (Sandbox Code Playgroud)
但它没有触发BackgroundWorker_RunWorkerCompleted
事件,这对我没有任何伤害,但是由于后台工作人员不按预期工作而杀了我,我只是一直在想"应该有更好的方法!".
所以,我一直在阅读有关这么多新想法的内容,比如为什么BackgroundWorker
现在使用它们Async/await
.有些人说使用Task.Run()
它是神奇的.我甚至阅读了关于这个我从未听说过的天赐TPL数据流的推荐和博客.到目前为止,我还没有找到一种结构化,记录和布局的方法BackgroundWorker
.(除非它是如此简单或一个甚至不需要文档或.etc的内衬)所以,伙计们,这是什么解决方案.或者更好的方式问:
实现执行异步 的无限运行任务的正确方法是什么BigJob()
?并可根据要求停止
创建CancellationTokenSource并将其Token传递给异步任务.这将允许您向异步任务发出信号,要求取消.更多信息:http://msdn.microsoft.com/en-us/library/hh873177(v = vs1010).aspx
你应该用CancellationTokenSource
.但是不要传递Token
给Task.Run
方法,也不要抛出异常.只需检查是否要求取消,然后停止.
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
Task.Run(
async () =>
{
while (!ct.IsCancellationRequested)
{
await ConnectAsync();
await ReadAsync();
await WriteAsync();
await DisconnectAsync();
}
});
cts.Cancel();
Run Code Online (Sandbox Code Playgroud)
当您传递CancellationToken
给Task本身(Task.Run(async () => ..., ct)
)时,您不能在委托中使用它.如果在任务开始运行之前调用了取消,它将仅取消该任务.它开始后,呼叫Cancel
不会有任何影响.