Existe uma maneira 'padrão' de especificar que uma continuação de tarefa deve ser executada no thread a partir do qual a tarefa inicial foi criada?
Atualmente, tenho o código abaixo - ele está funcionando, mas acompanhar o despachante e criar uma segunda ação parece uma sobrecarga desnecessária.
dispatcher = Dispatcher.CurrentDispatcher;
Task task = Task.Factory.StartNew(() =>
{
DoLongRunningWork();
});
Task UITask= task.ContinueWith(() =>
{
dispatcher.Invoke(new Action(() =>
{
this.TextBlock1.Text = "Complete";
}
});
Control.Invoke(Action)
, ie.TextBlock1.Invoke
em vez dedispatcher.Invoke
Respostas:
Ligue para a continuação com
TaskScheduler.FromCurrentSynchronizationContext()
:Isso é adequado apenas se o contexto de execução atual estiver no encadeamento da interface do usuário.
fonte
await
é um bom padrão - mas apenas se você estiver dentro de umasync
contexto (como um método declaradoasync
). Caso contrário, ainda é necessário fazer algo como esta resposta.Com o assíncrono, você apenas faz:
Contudo:
fonte
false
versão me confunde. Eu pensei quefalse
significa que pode continuar em um segmento diferente .async
método (que é necessário, para usarawait
). Qual é a resposta quandoawait
não está disponível?Se você tiver um valor de retorno que precisará enviar para a interface do usuário, poderá usar a versão genérica como esta:
Isso está sendo chamado de um MVVM ViewModel no meu caso.
fonte
Eu só queria adicionar esta versão, porque este é um segmento tão útil e acho que é uma implementação muito simples. Eu usei isso várias vezes em vários tipos, se o aplicativo multithread:
fonte
TaskScheduler
faz parte da BCL,Dispatcher
não é) e pode ser usada para compor cadeias complexas de tarefas devido a não ter que se preocupar com nenhuma operação assíncrona de ignorar e esquecer (comoBeginInvoke
).Cheguei aqui no google porque estava procurando uma boa maneira de fazer coisas no thread
await
da interface do usuário depois de estar dentro de uma chamada Task.Run - Usando o código a seguir, você pode usar para voltar ao thread da interface do usuário novamente.Espero que isso ajude alguém.
Uso:
fonte
static
a aulaUI
.