2015-06-21 3 views
0

Этот метод вызывается из основного потока wpf. Throwing - Невозможно неявно преобразовать тип '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)); 

Примечание я бы посоветовал вам не использовать специальное Threadpool нить, чтобы удалить элемент из коллекции. Это кажется излишним. Вместо этого пусть поточно-пул потоков уже посвященный удаления элементов его работу:

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

Edit:

Если вы хотите разместить на SynchronizationContext:

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

Я думаю, он хочет использовать контекст синхронизации для обновления исходной коллекции в потоке пользовательского интерфейса. В этом случае вы можете просто использовать метод «Post» контекста синхронизации. – Dirk

+0

@Dirk Это определенно возможно. Если это то, что хочет OP, он должен сделать это вместо потока пользовательского интерфейса, IMO. –

+0

Это именно то, что я хочу. Как я могу использовать Post? Примером может служить оценка. –

0

Теперь, когда ваш код находится в синхронизации, ваша проблема в том, что DocCollection.Remove(item) фактически возвращает истину/ложь, будучи логический метод, который указывает на то, удалось ли или не удалить или нет.

Если вы удалите всю эту строку, все будет работать красиво, и элементы будут обработаны (но не удалены).

Я думаю, что вы хотите, чтобы на самом деле использовать Результат выполнения задачи (обратите внимание, что она будет заблокирована, хотя).

Посмотрите на official page on MSDN для получения дополнительной информации.

+0

Я хочу, чтобы обработанный элемент был удален сразу. Можете ли вы предложить совместимый синтаксис. –

Смежные вопросы