2015-09-25 38 views
3

我的問題是爲什麼延遲方法不起作用(整個操作不等待4秒),60%沒有顯示在lable1內部。延遲繼續現在正在工作

爲了更精確的操作順序應該是這樣和整個操作應採取8 seconds.but它需要4秒,剛內LongTimeMethod1()Thread.Sleep(4000)工作

LongTimeMethod1()//delay for 4 sec,show 60% 
delay()//delay for 4 sec 
LongTimeMethod()//40% imidiatly 

我知道我可以寫代碼只是等待和異步,但我想知道我在這段代碼中做錯了什麼。

private void button1_Click(object sender, EventArgs e) 
    { 
     CallBigMethod(); 
     label1.Text [email protected]"Waiting ..."; 
    } 
    private async void CallBigMethod() 
    { 
     var result = await BigMethod(); 
     label1.Text = result; 


    } 
    private Task<string> BigMethod() 
    { 
     return Task.Factory 
     .StartNew(() => LongTimeMethod1()) 
     .ContinueWith((pre) => Delay()) 
     .ContinueWith((pre) => LongTimeMethod()); 
    }  
    private string LongTimeMethod() 
    { 

     return "40%..."; 
    } 
    public async Task Delay() 
    { 

     await Task.Delay(4000); 

    } 
    private string LongTimeMethod1() 
    { 
     Thread.Sleep(4000); 
     return "60%..."; 
    } 
+0

@PetSerAl它只是解決了時間問題,但它不能解決顯示60%的問題 –

回答

0

試試這個

private Task<string> BigMethod() 
    { 

     return Task.Factory.StartNew(() => LongTimeMethod1()).ContinueWith(async (pre) => await Delay()).ContinueWith((pre) => LongTimeMethod()); 
    } 
+0

什麼也沒有改變 –

+0

沒有任何理由在'ContinueWith'中使用'async' lambda。它什麼都不做。這與OP的代碼相同。 – Servy

5

Task通過.ContinueWith((pre) => Delay())返回實際上是一個Task<Task>。這個延續將在開始時延遲完成,但由於延遲是異步的,它不會等待它完成。你需要打開Task<Task>,這樣你才能爲內部任務添加一個延續,並在延遲結束時讓程序繼續運行,而不是當它結束時開始

幸運的是,有一個Unwrap方法,只是爲我們做這一切。

private Task<string> BigMethod() 
{ 
    return Task.Factory 
    .StartNew(() => LongTimeMethod1()) 
    .ContinueWith((pre) => Delay()) 
    .Unwrap() 
    .ContinueWith((pre) => LongTimeMethod()); 
}  

這就是說,整個事情就簡單多了當的方法是async,而不是使用ContinueWith

private Task<string> BigMethod() 
{ 
    await Task.Run(() => LongTimeMethod1()); 
    await Delay(); 
    return await Task.Run(() => LongTimeMethod()); 
} 
+0

感謝代碼,它解決了時間問題,它需要8秒,但仍然沒有在標籤中顯示60% –

+0

@E_N_Y這是因爲'LongTimeMethod'返回40%,而不是60%。如果你切換'LongTimeMethod'和'LongTimeMethod1'的位置,那麼結果會改變。如果您對這些方法使用了更有意義的(或至少可區分的)名稱,那麼這可能會更少混淆。 – Servy

+0

所以你的意思是我沒有辦法顯示60%,然後4秒延遲,然後用這個代碼打印40%?!我知道如果我改變我可以導致的方法會不同:) –