Задача ContinuewWith ожидает возврата ошибки

У меня есть следующий код, который использует System.Threading.Tasks

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!!");
    });

}

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

«Невозможно присвоить void локальной переменной с неявным типом»** в var someTask

Затем я меняю var someTask на Task someTask, но теперь получаю сообщение об ошибке:

«Невозможно неявно преобразовать тип void в System.Threading.Tasks.Task».

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


person VAAA    schedule 25.02.2013    source источник
comment
Вы действительно должны следовать модели Стивена из вашего предыдущего вопроса. Это правильный способ проектирования этой системы. Как я там прокомментировал, журналирование должно быть даже не в UploadDocument, оно должно быть в вызывающем.   -  person Servy    schedule 25.02.2013
comment
Сторона не: Никогда не пишите async void. блоги. msdn.com/b/lucian/archive/2013/02/18/   -  person SLaks    schedule 26.02.2013
comment
Что я должен использовать? Я видел в вашей ссылке, что пустота в порядке только в обработчиках, а моя - нет :( Спасибо   -  person VAAA    schedule 26.02.2013


Ответы (1)


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

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

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

Вы можете упростить свой код следующим образом:

await Task.Run(() => {
    using (...) {
        ...
    }
});
LogText("Done!");
person SLaks    schedule 25.02.2013
comment
Хорошо, я могу избавиться от ожидания, но как мне заставить задачу выполняться асинхронно? - person VAAA; 25.02.2013
comment
@VAAA Что ты имеешь в виду? SLaks не говорит, что вы должны избавиться от await, он говорит, что вы должны избавиться от ContinueWith(). - person svick; 25.02.2013