2017-05-28 29 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 –