我有一个片段,看起来像这样,
private void btn_Click(object sender, EventArgs e)
{
try
{
var res = Task.Run(() => DoTask(param1, param2));
if(res.IsCompleted)
{
MessageBox.Show("Done");
}
MessageBox.Show("DoTask isn't called yet.");
}
catch
{
MessageBox.Show("Something wrong");
}
}
DoTask
方法看起来像这个
private async Task<bool> DoTask(int p1, int p2)
{
// run long tasks
}
我想在任务完成后显示Done
消息。但这永远不会奏效。相反,消息DoTask isn't called yet.
总是在DoTask
执行任务之前被调用。
Panagiotis的答案是正确的。如果您在一个不是事件处理程序的方法中遇到同样的情况,并且由于某种原因无法使用async
,那么下面是下一个最佳选项:
Task<bool> task = Task.Run(() => DoTask(param1, param2));
bool res = task.GetAwaiter().GetResult();
从任务中获取结果。在不等待的情况下运行
从异步任务中获得结果的正确方法是使用await
:
private async void btn_Click(object sender, EventArgs e)
{
try
{
var res = await Task.Run(() => DoTask(param1, param2));
if(res)
{
MessageBox.Show("Done");
}
MessageBox.Show("DoTask isn't called yet.");
}
catch
{
MessageBox.Show("Something wrong");
}
}
请注意,您应该通常避免async void
,但由于此代码是一个事件处理程序,因此async void
是可以的。
简单方法:
bool result = DoTask(paran1, param2).Result;
不需要使用Task.Run((。但您可以通过以下方式使用它(坏方法(:
bool result = Task.Run(() => DoTask(paran1, param2).Result).Result;