2015-06-21 69 views
0

此方法是從wpf主線程調用的。 投擲 - 不能隱式地將類型'bool'轉換爲'System.Threading.Tasks.Task'錯誤。 我在做什麼錯? DocCollection的類型爲ObservableCollection。無法將類型'bool'隱式轉換爲'System.Threading.Tasks.Task'

Task TaskProcesQueue(SynchronizationContext _SyncContext) 
{ 
    return Task.Run(() => 
    { 
     if (DocCollection != null) 
     { 
      foreach (var item in DocCollection.ToList()) 
      { 
       ProcessCurrentDocument(item); 
       var t = Task.Run(() => DocCollection.Remove(item), _SyncContext)); 
      } 
     } 
    }); 
} 
+0

你肯定這是加工?您的右括號似乎不同步... – Noctis

+0

使用'Task.Run'從集合中刪除項目(假設集合的大小合理)是多餘的。 –

+0

@YuvalItzchakov不,不是。 OP正在這樣做,以確保刪除發生在正確的同步上下文中。直接調用'Remove'會在後臺線程中執行,並且會導致它引發的任何事件在後臺線程中運行。現在,OP在問題中的含義並不完全是正確的方式,因此錯誤信息,但您建議的方式也不是。 – hvd

回答

3

Task.Run沒有超載接受SynchronizationContext。因此,當重載決議啓動時,它無法找到合適的過載。如果刪除同步上下文,它編譯:

var t = Task.Run(() => DocCollection.Remove(item)); 

注意我建議你不要使用專用線程池線程從集合中刪除的項目。這似乎是多餘的。相反,我們已經致力於消除項目它的線程池線程的工作:

while (DocCollection.Count > 0) 
{ 
    ProcessCurrentDocument(item); 
    DocCollection.Remove(item); 
} 

編輯:

如果你想發佈在SynchronizationContext

_SyncContext.Post(_ => { DocCollection.Remove(item) }, null); 
+1

我想他想使用同步上下文來更新UI線程上的原始集合。在這種情況下,您可以簡單地使用同步上下文的Post方法。 – Dirk

+0

@Dirk這絕對有可能。如果這就是OP想要的,他應該在UI線程上代替IMO。 –

+0

這正是我想要的。我如何使用Post?一個例子,將不勝感激。 –

0

現在,你的代碼是同步的,你的問題是,DocCollection.Remove(item)真的返回真/假,是指示刪除是否成功與否的布爾方法。

如果你將刪除整條線,所有將很好地工作,項目將被處理(但不會被刪除)。

我想你想要的是實際使用運行任務的結果(注意它會阻止)。

查看official page on MSDN瞭解更多信息。

+0

我希望處理的項目立即被移除。你能建議一個兼容的語法嗎? –

相關問題