[英]Can I use async / await to simulate a background worker?
我试图避免将一堆BackgroundWorkers链接在一起。 我正在做一些事情,要求我等待UI更新后才能继续执行。 显然,我不能使用Sleep,因为这会阻止UI线程更新并达到目的。 我找到了下面我认为是答案的代码,但它似乎是task.Wait();
行仍在阻止UI线程。
static void Main(string[] args)
{
var task = Task.Run(() => DoSomething());
task.Wait();
// once the task completes, now do more
}
static void DoSomething()
{
// something here that is looking for the UI to change
}
我还尝试了以下操作,它们的作用相同:
static void Main(string[] args)
{
var task = Task.Run(() => DoSomethingAsync());
task.Wait();
// once the task completes, now do more
}
private async Task DoSomethingAsync()
{
// something here that is looking for the UI to change
}
是否可以做我想做的事情,如果是,我做错了什么?
您需要await
任务而不是阻塞任务。 您可以在async
方法中执行此操作。
现在, Main
不能是async
但是事件处理程序可以是(我想这是您实际使用该代码的地方):
public async void EventHandler(object sender, EventArgs e)
{
await Task.Run(() => DoSomething()); // wait asynchronously
// continue on the UI thread
}
请注意,它是async void
,仅应在事件处理程序上使用。 所有其他async
方法应返回任务。
使用Task.Run
意味着您使用ThreadPool线程。 要真正异步地等待UI“执行某些操作”,您应该使用TaskCompletionSource
。 创建它并await
它的Task
属性,并在UI更改后完成该任务:
public async void EventHandler(object sender, EventArgs e)
{
_tcs = new TaskCompletionSource<bool>();
await _tcs.Task;
}
public void UIChanged(object sender, EventArgs e)
{
_tcs.SetResult(false);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.