2013-02-25 3 views
0

У меня есть следующий код, который использует System.Threading.TasksTask ContinuewWith ждут возвращения ошибки

private async void UploadDocument(System.IO.FileInfo fileInfo) 
{ 
    var someTask = await Task.Run<bool>(() => 
    { 
     // open input stream 
     using (System.IO.FileStream stream = new System.IO.FileStream(FileTextBox.Text, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 
     { 
      using (StreamWithProgress uploadStreamWithProgress = new StreamWithProgress(stream)) 
      { 
       uploadStreamWithProgress.ProgressChanged += uploadStreamWithProgress_ProgressChanged; 

       // start service client 
       FileTransferWCF.FileTransferServiceClient client = new FileTransferWCF.FileTransferServiceClient(); 
       //FileTransferClient.FileTransferServiceClient client = new FileTransferClient.FileTransferServiceClient(); 

       // upload file 
       client.UploadFile(fileInfo.Name, fileInfo.Length, uploadStreamWithProgress); 

       // close service client 
       client.Close(); 
      } 
     } 

     return true; 

    }).ContinueWith(r =>{ 
     if(r.Result) LogText("Done!!"); 
    }); 

} 

Если я оставлю это и попытаться скомпилировать я получаю:

"Cannot assign void to an implicitly-typed local variable"** in the var someTask

Так я тогда изменить var someTask к Task someTask но теперь Я получаю сообщение об ошибке:

"Cannot implicitly convert type 'void' to 'System.Threading.Tasks.Task'".

Любая подсказка о том, как d с этим?

+0

Вы действительно должны следовать модели Стефана из вашего предыдущего вопроса. Это правильный способ разработки этой системы. Поскольку я прокомментировал это, запись не должна быть даже в «UploadDocument», в первую очередь, она должна быть в вызывающем. – Servy

+1

Сторона не: ** Никогда не пишите 'async void' **. http://blogs.msdn.com/b/lucian/archive/2013/02/18/talk-the-new-async-design-patterns.aspx – SLaks

+0

Что я должен использовать? Я видел в вашей ссылке, что void в порядке только в обработчиках, а у моего нет :(Спасибо – VAAA

ответ

5

Ключевое слово await ждет завершения задачи и возвращает результат .

Он не возвращает задачу сам.

Поскольку ваш ContinueWith() не имеет результата (он возвращает Task, не Task<T>), ваше выражение await возвращает void, который, очевидно, не может быть присвоено переменной.

Вы можете упростить код так:

await Task.Run(() => { 
    using (...) { 
     ... 
    } 
}); 
LogText("Done!"); 
+0

Хорошо, я могу избавиться от ожидания, но тогда как я могу заставить задачу выполнить async? – VAAA

+1

@VAAA Что значит? SLaks isn 't говорю, что вам следует избавиться от 'await', он говорит, что вам следует избавиться от' ContinueWith() '. – svick

+0

Его работа, как вы сказали !! Спасибо большое @svick – VAAA

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