2014-09-23 104 views
0

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

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

回答

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

添加

await task1; 

然后评估resultado。

if(resultado!=null)... 
+0

这不会阻止该过程? – mtsys 2014-09-23 12:43:18

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