【发布时间】:2016-02-08 20:12:31
【问题描述】:
我对异步/等待编程还很陌生,有时我觉得我理解它,然后突然发生了一些事情,让我陷入了循环。
我正在测试 winforms 应用程序中对此进行尝试,这是我拥有的一个 sn-p 版本。这样做会阻塞 UI
private async void button1_Click(object sender, EventArgs e)
{
int d = await DoStuffAsync(c);
Console.WriteLine(d);
}
private async Task<int> DoStuffAsync(CancellationTokenSource c)
{
int ret = 0;
// I wanted to simulator a long running process this way
// instead of doing Task.Delay
for (int i = 0; i < 500000000; i++)
{
ret += i;
if (i % 100000 == 0)
Console.WriteLine(i);
if (c.IsCancellationRequested)
{
return ret;
}
}
return ret;
}
现在,当我通过将“DoStuffAsync()”的主体包装在 Task.Run 中进行轻微更改时,它工作得非常好
private async Task<int> DoStuffAsync(CancellationTokenSource c)
{
var t = await Task.Run<int>(() =>
{
int ret = 0;
for (int i = 0; i < 500000000; i++)
{
ret += i;
if (i % 100000 == 0)
Console.WriteLine(i);
if (c.IsCancellationRequested)
{
return ret;
}
}
return ret;
});
return t;
}
说了这么多,处理这种情况的正确方法是什么?
【问题讨论】:
标签: c# winforms asynchronous async-await