İ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 async
yöntemde, bu "verim" noktaları await
ifadelerdir.
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; async
dö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 :
async
Anahtar kelime (olduğunu, bu sağlayan bir asenkron metot verir await
ifadeler). async
yöntemler döndürebilir Task
, Task<T>
(Gerekirse) veya void
.
- Belirli bir modeli izleyen herhangi bir tür beklenebilir. En yaygın beklenen tipler
Task
ve 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 " async
engelleme yerine arayanına nasıl geri dönebilecek bir yöntem oluştururum " ise, yanıt yöntemi bildirmek async
ve 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
, await
ifadelerinde “beklenebilir” olan koda bağımlı olmaktır . Bu "beklenenler" diğer async
yö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.FromResult
vs). 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
/ await
intro blogumda; sonunda bazı iyi takip kaynakları vardır. İçin MSDN belgeleri async
de alışılmadık derecede iyi.