2013-05-03 185 views
1

我想我的foreach函數轉換到LINQ功能異步等待在LINQ .TakeWhile

這裏是我的正常碼[做工精細]

var tList = new List<Func<Task<bool>>> { Method1, Method2 }; 
    tList.Shuffle(); 

    int succeed = 0; 
    foreach (var task in tList) 
    { 
     var result = await task(); 

     if(!result) 
      break; 

     succeed += 1; 
    } 

    MessageBox.Show(succeed == 1 ? "Loading complete." : "Something went wrong!"); 

在這裏被轉換到LINQ後,[給予2個編譯錯誤]

var tList = new List<Func<Task<bool>>> { Method1, Method2 }; 
    tList.Shuffle(); 

    int succeed = tList.Select(async task => await task()).TakeWhile(result => result).Count(); 

    MessageBox.Show(succeed == 1 ? "Loading complete." : "Something went wrong!"); 

錯誤

  • 無法轉換lambda表達式委託類型「System.Func,布爾>」因爲有些 在塊中的返回類型不是隱式轉換爲
    委託返回類型
  • 無法隱式轉換型「的System.Threading .Tasks.Task」到‘布爾’

我不知道爲什麼編譯器是給這些消息,所以任何幫助將不勝感激。

注:我也嘗試.TakeWhile(async result => await result)與錯誤

  • 異步方法的返回類型必須爲void,任務或工作T

方法1和方法2,如果有人想要它們:

public async Task<bool> Method1() 
{ 
    await Task.Delay(1000); 
    Console.WriteLine("Method1"); 
    return false; 
} 

public async Task<bool> Method2() 
{ 
    await Task.Delay(1000); 
    Console.WriteLine("Method2"); 
    return true; 
} 

回答

0

這很簡單,因爲由於編譯器已經指示,因此無法將Task<bool>轉換爲bool ..

更改此:

.TakeWhile(result => result) 

..to這樣的:

.TakeWhile(result => result.Result) 
+0

但是,當我使用result.Result UI完全凍結?任何想法 ? – 2013-05-03 01:08:37

+0

@RuneS你的UI凍結的原因是因爲編譯器認爲你的方法不是異步的。修正你的代碼後,像西蒙建議看看在錯誤列表窗口中的警告「異步方法缺乏等待」 – Raghu 2013-05-03 01:13:13

+0

@Ragzitsu:不正確的抹布,如果我用它等待它說'布爾'不等待... – 2013-05-03 01:15:50

0

有第一和第二代碼(不這樣做同樣的事情)之間的根本區別。

在您正在迭代任務列表的第一個代碼上。第二,你只是將每個任務轉換成另一個任務 - 異步lambda的返回類型將永遠是任務的一部分。

因爲你在等待順序執行每個任務的區域,他們真的按順序運行。這是你打算做什麼?

嘗試這樣的事情(未測試):

var tList = new List<Func<Task<bool>>> { Method1, Method2 }; 
tList.Shuffle(); 

int succeed = Task.WaitAll(tList.ToArray()) 
    .TakeWhile(result => result).Count(); 

MessageBox.Show(
    succeed == 1 
    ? "Loading complete." 
    : "Something went wrong!"); 

但是,這仍然是一個陌生的一段代碼。

+0

我希望它們按順序運行。 – 2013-05-03 01:14:30

+0

對不起,但也是這個代碼是錯誤的 – 2013-05-03 01:24:29

+0

這是你在找什麼? int succeed = tList.Select(task => task.Result).TakeWhile(result => result).Count(); 或者,可能是這樣的: bool succeed = tList.TakeWhile(task => task.Result).Any(); – 2013-05-05 23:54:24