İlk olarak, bazı terminolojileri temizleyelim: "asenkron" ( async), başlamadan önce çağıran iş parçacığına geri denetim sağlayabileceği anlamına gelir. Bir asyncyöntemde, bu "verim" noktaları awaitifadelerdir.
MSDN belgeleri tarafından "arka plan iş parçacığında yürütülür" anlamında yıllardır kullanılan (mis) olarak "asenkron" teriminden çok farklıdır.
Sorunu daha da karıştırmak, async"beklenebilir" den çok farklıdır; asyncdönüş türleri beklenmeyen bazı yöntemler ve beklenmeyen türleri döndüren birçok yöntem vardır async.
Onlar neyi kadar yeter değildir ; işte budur şunlardır :
asyncAnahtar kelime (olduğunu, bu sağlayan bir asenkron metot verir awaitifadeler). asyncyöntemler döndürebilir Task, Task<T>(Gerekirse) veya void.
- Belirli bir modeli izleyen herhangi bir tür beklenebilir. En yaygın beklenen tipler
Taskve Task<T>.
Bu nedenle, sorunuzu "bir işlemi bir arka plan iş parçacığında beklenen şekilde nasıl çalıştırabilirim" olarak yeniden biçimlendirirsek , yanıt şu şekildedir Task.Run:
private Task<int> DoWorkAsync() // No async because the method does not need await
{
return Task.Run(() =>
{
return 1 + 2;
});
}
(Ancak bu model kötü bir yaklaşımdır; aşağıya bakınız).
Ancak sorunuz " asyncengelleme yerine arayanına nasıl geri dönebilecek bir yöntem oluştururum " ise, yanıt yöntemi bildirmek asyncve await"sağlama" noktaları için kullanmaktır :
private async Task<int> GetWebPageHtmlSizeAsync()
{
var client = new HttpClient();
var html = await client.GetAsync("http://www.example.com/");
return html.Length;
}
Yani, şeylerin temel paterni async, awaitifadelerinde “beklenebilir” olan koda bağımlı olmaktır . Bu "beklenenler" diğer asyncyöntemler veya sadece beklenenleri döndüren normal yöntemler olabilir. Dönen Düzenli yöntemler Task/ Task<T> edebilirsiniz kullanmak Task.Run, bir arka plan iş parçacığı üzerinde kod çalıştırmak için, ya da (daha yaygın) kullanabilecekleri TaskCompletionSource<T>veya kısayolları (biri TaskFactory.FromAsync, Task.FromResultvs). Ben yok bütün bir yöntem içinde sarma tavsiye Task.Run; eşzamanlı yöntemlerin eşzamanlı imzaları olmalıdır ve aşağıdakilere sarılıp sarılmayacağı tüketiciye bırakılmalıdır Task.Run:
private int DoWork()
{
return 1 + 2;
}
private void MoreSynchronousProcessing()
{
// Execute it directly (synchronously), since we are also a synchronous method.
var result = DoWork();
...
}
private async Task DoVariousThingsFromTheUIThreadAsync()
{
// I have a bunch of async work to do, and I am executed on the UI thread.
var result = await Task.Run(() => DoWork());
...
}
Bir var async/ awaitintro blogumda; sonunda bazı iyi takip kaynakları vardır. İçin MSDN belgeleri asyncde alışılmadık derecede iyi.