2015-10-20 82 views
3

我想返回异步任务的字符串结果。如何从异步任务返回结果?

System.Threading.Tasks.Task.Run(async() => await audatex.UploadInvoice(assessment, fileName)); 

public async Task UploadInvoice(string assessment, string fileName) 
{ 
    //Do stuff 
    return string; 
} 

异步编程困惑我,有人可以请解释吗?

+1

那你试试/什么是问题?快速谷歌提出了[如何:从任务中返回一个值](https://msdn.microsoft.com/en-us/library/dd537613(v = vs.110).aspx)。您需要将“任务”更改为“任务”。 –

回答

8

你的方法应该返回Task<string>,不Task

public async Task<string> UploadInvoice(string assessment, string fileName) 
{ 
    //Do stuff 
    return string; 
} 
+0

我会怎样称呼它? – Pomster

+0

@Pomster正如我所提到的那样:'string result = await UploadInvoice(“”,“”)' – Ric

+1

await运算符需要位于异步和返回类型任务中。如果我添加Task.Run(async()=>等待UploadInvoice ..我得到错误..不能隐式转换类型'System.Threading.Tasks.Task '到'字符串' – Pomster

2

这样做:

public async Task<string> UploadInvoice(string assessment, string fileName) 

然后await结果:

string result = await UploadInvoice("", "");

更多的例子可以在这里看到:

Async Return Types

+0

我得到这个错误。'await '运算符只能在异步方法中使用,考虑用'async'修饰符来标记这个方法,并将它的返回类型改为'Task' – Pomster

+0

你需要从'async'方法中调用它,我猜你不是?尝试以下操作:'var myTask = Task.Run((=)a.UploadInvoice(“”,“”)); string result = myTask.Result;' – Ric

9

异步编程可能需要一段时间来围绕让你的头,所以我会后在什么情况下一直有用对我来说,帮助别人。

如果你想将业务逻辑从异步代码中分离出来,你可以保持您UploadInvoice方法免费异步:

private string UploadInvoice(string assessment, string filename) 
{ 
    // Do stuff  
    Thread.Sleep(5000); 

    return "55"; 
} 

然后你就可以创建一个异步包装:

private async Task<string> UploadInvoiceAsync(string assessment, string filename) 
{ 
    return await Task.Run(() => UploadInvoice(assessment, filename)); 
} 

捐赠你可以选择哪种呼叫:

public async Task CallFromAsync() 
{ 
    string blockingInvoiceId = UploadInvoice("assessment1", "filename"); 

    string asyncInvoiceId = await UploadInvoiceAsync("assessment1", "filename"); 
} 

有时你可能需要调用一个as来自非异步方法的ync方法。

// Call the async method from a non-async method 
public void CallFromNonAsync() 
{ 
    string blockingInvoiceId = UploadInvoice("assessment1", "filename"); 

    Task<string> task = Task.Run(async() => await UploadInvoiceAsync("assessment1", "filename")); 
    task.Wait(); 
    string invoiceIdAsync = task.Result; 
} 

----编辑:添加更多的例子,因为人们发现这个有用----

有时要等待一个任务,或继续一项任务在完成的方法。这是一个可以在控制台应用程序中运行的工作示例。

class Program 
    { 
     static void Main(string[] args) 
     { 
      var program = new Program(); 
      program.Run(); 
      Console.ReadKey(); 
     } 

     async void Run() 
     { 
      // Example 1 
      Console.WriteLine("#1: Upload invoice synchronously"); 
      var receipt = UploadInvoice("1"); 
      Console.WriteLine("Upload #1 Completed!"); 
      Console.WriteLine(); 

      // Example 2 
      Console.WriteLine("#2: Upload invoice asynchronously, do stuff while you wait"); 
      var upload = UploadInvoiceAsync("2"); 
      while (!upload.IsCompleted) 
      { 
       // Do stuff while you wait 
       Console.WriteLine("...waiting"); 
       Thread.Sleep(900); 
      } 
      Console.WriteLine("Upload #2 Completed!"); 
      Console.WriteLine(); 

      // Example 3 
      Console.WriteLine("#3: Wait on async upload"); 
      await UploadInvoiceAsync("3"); 
      Console.WriteLine("Upload #3 Completed!"); 
      Console.WriteLine(); 

      // Example 4 
      var upload4 = UploadInvoiceAsync("4").ContinueWith<string>(AfterUploadInvoice); 
     } 

     string AfterUploadInvoice(Task<string> input) 
     { 
      Console.WriteLine(string.Format("Invoice receipt {0} handled.", input.Result)); 
      return input.Result; 
     } 

     string UploadInvoice(string id) 
     { 
      Console.WriteLine(string.Format("Uploading invoice {0}...", id)); 
      Thread.Sleep(2000); 
      Console.WriteLine(string.Format("Invoice {0} Uploaded!", id)); 
      return string.Format("<{0}:RECEIPT>", id); ; 
     } 

     Task<string> UploadInvoiceAsync(string id) 
     { 
      return Task.Run(() => UploadInvoice(id)); 
     } 
    } 
0
public async Task<string> UploadInvoice(string assessment, string fileName) 
{ 
    string result = GetResultString();//Do stuff  
    return Task.FromResult(result); 
} 
+2

虽然这段代码可能是解决方案,一个解释](//meta.stackexchange。com/questions/114762/explain-completely-code-based-answers)确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 – Adam