Каждый пост в блоге, который я читал, рассказывает вам, как использовать асинхронный метод в C #, но по какой-то странной причине никогда не объясняйте, как создавать свои собственные асинхронные методы для потребления. Итак, у меня есть этот код прямо сейчас, который использует мой метод:
private async void button1_Click(object sender, EventArgs e)
{
var now = await CountToAsync(1000);
label1.Text = now.ToString();
}
И я написал этот метод, который CountToAsync
:
private Task<DateTime> CountToAsync(int num = 1000)
{
return Task.Factory.StartNew(() =>
{
for (int i = 0; i < num; i++)
{
Console.WriteLine("#{0}", i);
}
}).ContinueWith(x => DateTime.Now);
}
Является ли это использование Task.Factory
лучшего способа написания асинхронного метода, или я должен написать это по-другому?
c#
async-await
c#-5.0
Халид Абухакмех
источник
источник
Ответы:
Я не рекомендую,
StartNew
если вам не нужен этот уровень сложности.Если ваш асинхронный метод зависит от других асинхронных методов, самый простой подход - использовать
async
ключевое слово:Если ваш асинхронный метод выполняет работу с процессором, вы должны использовать
Task.Run
:Вы можете найти мое
async
/await
вступление полезным.источник
TaskFactory.FromAsync
чтобы обернутьBeginInvoke
. Не уверен, что вы имеете в виду под "кодом обратного вызова"; не стесняйтесь оставить свой вопрос с кодом.Task.Delay
возврата?await
это «асинхронное ожидание», поэтому он не переходит к следующей итерации, пока неTask.Delay
завершится задание, возвращаемое .Если вы не хотите использовать async / await внутри вашего метода, но по-прежнему «украшаете» его, чтобы иметь возможность использовать ключевое слово await извне, TaskCompletionSource.cs :
Отсюда и здесь
Я видел также используется в источнике .NET, например. WebClient.cs :
Наконец, я нашел полезным также следующее:
Введение в Async / Await на ASP.NET
Если целью является улучшение масштабируемости (а не отзывчивости), все это зависит от наличия внешнего ввода / вывода, который предоставляет возможность сделать это.
источник
Один очень простой способ сделать метод асинхронным - это использовать метод Task.Yield (). Как говорится в MSDN:
Вставьте его в начало вашего метода, и он немедленно вернется к вызывающей стороне и завершит оставшуюся часть метода в другом потоке.
источник
Task.Yield()
действительно полезно для случаев, когда вы хотите убедиться, что возвращенноеTask
не будет немедленно завершено при создании.