программирование Асинхронный может занять некоторое время, чтобы получить вокруг головы, так что я выложу то, что было полезно для меня в случае это помогает кому-либо еще.
Если вы хотите, чтобы отделить бизнес-логику от кода асинхронного, вы можете сохранить ваш метод 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));
}
}
Что вы пытаетесь/чем проблема? Быстрый google предлагает [Как вернуть значение из задачи] (https://msdn.microsoft.com/en-us/library/dd537613 (v = vs.110) .aspx). Вам нужно изменить 'Task' на' Task '. –