任务结束后的处理结果

本文关键字:处理 结果 结束 任务 | 更新日期: 2023-09-27 18:24:00

我有下面的Task,希望获得Servico.ExportarProdutosPorArquivo(parametros)的结果,并在线程完成后使用它。它在做这个?

private void RealizarSolicitacao(ParametrosExportacaoProdutos parametros, FilialDaConfiguracao filial)
{                  
    ResultadoExportacaoProdutos resultado;
    Task task1 = Task.Factory.StartNew(() => resultado = Servico.ExportarProdutosPorArquivo(parametros));
}      

任务结束后的处理结果

有几种方法可以做到这一点:

  • async/await(如果使用C#5)。您必须将方法返回类型更改为async Task,然后使用await task1;等待任务的结果。这不会阻塞当前线程
  • task1.Wait()阻塞直到任务完成
  • task1.ContinueWith调度任务完成后将执行的延续

我还建议您将任务更改为Task<ResultadoExportacaoProdutos>,即var task1 = Task.Factory.StartNew(() => Servico.ExportarProdutosPorArquivo(parametros));。这样做更干净,因为任务不在方法范围的变量中写入。

async/await版本将成为

private async Task RealizarSolicitacao(ParametrosExportacaoProdutos parametros, FilialDaConfiguracao filial)
{                  
    var resultado = await Task.Run(() => Servico.ExportarProdutosPorArquivo(parametros));
    // do something with resultado
}

阻止Wait/Result的版本为:

private void RealizarSolicitacao(ParametrosExportacaoProdutos parametros, FilialDaConfiguracao filial)
{                  
    var task1 = Task.Run(() => Servico.ExportarProdutosPorArquivo(parametros));
    var resultado  = task1.Result;
    // do something with resultado
}

添加

await task1;

然后评估结果。

if(resultado!=null)...

查看MSDN链接。例如:

private void RealizarSolicitacao(ParametrosExportacaoProdutos parametros, FilialDaConfiguracao filial)
{                          
    Task<ResultadoExportacaoProdutos> task1 = Task<ResultadoExportacaoProdutos>.Factory.StartNew(() =>
    {
        return Servico.ExportarProdutosPorArquivo(parametros);
    });
    //The Result property blocks the calling thread until the task finishes.
    ResultadoExportacaoProdutos resultado = task1.Result;
}