2017-05-28 63 views
0

我觉得有更好的方法可以做以下事情并寻找其他意见。基本上,我试图利用异步/等待模式,但需要从方法返回一个布尔值,以指示在导致我用任务包装任务的方法中发生的事情,以便这可以完成。我的spidey sense告诉我我的实现有些问题。包装任务以返回值

在下面的例子中,“LongRunningTask”是我没有控制权的东西,因为它是一个返回Task的库方法,所以我不能改变它。流程逻辑的其余部分可以更改。很明显,这只是我真正的问题的一个虚构的表示,但意在证明这个问题,所以不要陷入硬编码的“GetData”中,等等......

看一看,让我知道其他选择。

void Main() 
{ 
    StartApplication(); 
} 

private async void StartApplication() 
{ 
    // This is a just fictional example passing hard-coded GetData 
    var didExecuteLongRunningTask = await ProcessStuff("GetData"); 

    if (didExecuteLongRunningTask) 
    { 
     Console.WriteLine("Long running task was executed"); 
    } 
    else { 
     Console.WriteLine("Long running task was NOT executed"); 
    } 
} 

// Define other methods and classes here 
private async Task<bool> ProcessStuff(string command) 
{ 
    if (command == "GetData") 
    { 
     await LongRunningTask(); 
     return await Task<bool>.Factory.StartNew(() => true); 
    } 
    else 
    { 
     return await Task<bool>.Factory.StartNew(() => false); 
    } 
} 

private Task LongRunningTask() 
{ 
    return Task.Delay(2000); 
} 
+3

你的函数标记为'async'只是不'返回true;'或'返回false;' –

回答

2

是的,你是对的,你太过复杂了。你可以这样做:

private async Task<bool> ProcessStuff(string command) 
{ 
    if (command == "GetData") 
    { 
     await LongRunningTask(); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

你可以看看MSDN的更多信息:Asynchronous Programming

+0

哇,好不好...我甚至没有尝试,因为我没有意识到返回布尔会神奇地转换为任务。我将不得不研究这是如何工作的...... –

+0

@JoshuaMason你可以从我发布的MSDN链接中获得所有基础知识 –

+0

谢谢,我实际上已经使用了异步/等待模式很长一段时间,但不知何故错过了这个完全。这篇文章实际上很好地解释了这个特殊方面的魔力。 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/async-return-types –