任务结束后的处理结果

时间:2014-09-23 12:36:50

标签: c# asp.net asp.net-mvc

我有下面的任务,想要得到Servico.ExportarProdutosPorArquivo(parametros)的结果并在完成线程后使用它。这样做了吗?

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

3 个答案:

答案 0 :(得分:2)

有几种方法可以做到:

  • 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
}

答案 1 :(得分:1)

添加

await task1;

然后评估resultado。

if(resultado!=null)...

答案 2 :(得分:1)

看看MSDN Link。以你的例子:

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;
}