2015-10-20 3 views
3

Я хотел бы вернуть строковый результат из задачи async.Как вернуть результат из задачи async?

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

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

Асинхронное программирование смущает меня, может кто-нибудь объяснить это?

+1

Что вы пытаетесь/чем проблема? Быстрый google предлагает [Как вернуть значение из задачи] (https://msdn.microsoft.com/en-us/library/dd537613 (v = vs.110) .aspx). Вам нужно изменить 'Task' на' Task '. –

ответ

8

Ваш метод должен возвращать Task<string>, не Task:

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

Как бы я тогда позвонил? – Pomster

+0

@Pomster, как я уже упоминал: 'string result = wait UploadInvoice (" "," ")' – Ric

+1

Оператор ожидания должен находиться в задаче типа async и return type. если я добавлю Task.Run (async() => wait 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

» Я получаю эту ошибку. 'оператор может использоваться только в асинхронном методе. Рассмотрите возможность маркировки этого метода с помощью модификатора «async» и изменения его типа возврата на «Задача». – 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)); 
} 

Давать вы можете выбрать:

Иногда вам может потребоваться позвонить как 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; 
} 

---- EDIT: Добавление большего количества примеров, потому что люди нашли это полезным ----

Иногда вы хотите ждать, на задаче, или продолжить задачу с помощью метода по завершению. Вот рабочий пример, который вы можете запустить в консольном приложении.

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/explaining-whole-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – Adam

Смежные вопросы