【发布时间】:2018-11-16 05:37:52
【问题描述】:
我正在调用 Task.Run(() => DoSomething()).Result,这会导致 UI 冻结,这是因为我正在使用“.Result”。我需要 Result 因为我想返回值。
我不希望 StartSomething 方法是异步的,因为我不想等待 StartSomething 方法。我希望等待发生在 DoSomething()。
所以基本上我需要一个由同步方法调用的异步方法,而不会冻结 UI。另外,我想将异步方法中的值返回到按钮单击的顶层。
这段代码可以改进还是有其他解决方案?
private TaskCompletionSource<bool> TaskCompletion = null;
private void Button_Click(object sender, RoutedEventArgs e)
{
bool k = StartSomething();
}
private bool StartSomething()
{
return Task.Run(() => DoSomething()).Result;
}
private async Task<bool> DoSomething()
{
TaskCompletion = new TaskCompletionSource<bool>();
await Task.WhenAny(TaskCompletion.Task, Task.Delay(3000));
MessageBox.Show("DoSomething");
return true;
}
【问题讨论】:
-
BackgroundWorker 是你的朋友
-
如果你想学习多任务处理,我也建议使用 WindowsForms 等 GUI 技术中的 BackgroundWorker。任务、线程、线程池——所有这些都是高级技术。在尝试之前,您需要学习基础知识。
-
Task.Run(...).Result;。我不会说它 100% 总是错误的。也许只有 99.99999%。它是“任务系统,请在我(当前线程)做其他事情时找到一个合适的线程来运行这段代码。现在,在我做其他事情之前,我需要运行该代码的结果完成”。这与仅在当前线程上自己运行该代码的结果相同,但会抛出额外的不必要的机器