从任务中获取结果.运行而不等待



我有一个片段,看起来像这样,

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;

最新更新