Özellikle async/await
hakkında daha fazla bilgi edinmek istiyorum ve özellikle derleyicinin ek bir iş parçacığı oluşturmaksızın async
yönteminde ve await
'da "duraklat" yöntemini nasıl bildiğini öğreniyorum.Bir C# derleyicisi bir async yöntemini ne zaman keseceğini biliyor?
, en ı await sqlConnection.OpenAsync();
benim yöntemi "askıya" alır nerede olduğunu biliyoruz
DoSomeStuff();
await sqlConnection.OpenAsync();
DoSomeOtherStuff();
gibi bir async
yöntemi ve iplik havuzuna döner çağrılan iş parçacığı ve bir kez Task
var diyelim Bu, bağlantı açıklığının takibini tamamlarsa mevcut bir iş parçacığının DoSomeOtherStuff()
çalıştırdığı bulunur.
| DoSomeStuff() | "start" opening connection | ------------------------------------ |
| ---------------------------------------------------------- | DoSomeOtherStuff() - |
Burada kafam karıştı. Ben OpenAsync
(https://referencesource.microsoft.com/#System.Data/System/Data/Common/DBConnection.cs,e9166ee1c5d11996,references) kaynak koduna bakıp ben görev harici bir kaynak ile iletişim başladı çünkü derleyici ipliği "kesti" için bilemez bazı yeri görmek hayal
public Task OpenAsync() {
return OpenAsync(CancellationToken.None);
}
public virtual Task OpenAsync(CancellationToken cancellationToken) {
TaskCompletionSource<object> taskCompletionSource = new TaskCompletionSource<object>();
if (cancellationToken.IsCancellationRequested) {
taskCompletionSource.SetCanceled();
}
else {
try {
Open();
taskCompletionSource.SetResult(null);
}
catch (Exception e) {
taskCompletionSource.SetException(e);
}
}
return taskCompletionSource.Task;
}
, ama Bunu gerçekten görmüyorum ve aslında, Open();
, eşzamanlı olarak beklediğini ima ediyor gibi görünüyor. Birisi bunun nasıl "hatasız" gerçek "kodsuz" kod haline geldiğini açıklayabilir mi?
Eh, openAsync böyle uygulama aslında "gerçek zaman uyumsuz" kodu değil. – CodeFuller
C# derleyicisi bir gizli sınıfın * iki * yöntemlerle dönüşür kodunuzu yeniden yazar. DoSomeOtherStuff() çağrısı ikinci yöntemdedir. Her iki parçada sahip olabileceğiniz ve kullanabileceğiniz yerel değişkenler bu sınıfın alanları olur. Ildasm.exe yardımcı programını kullanarak görebileceğiniz bir şey. –
@CodeFuller Eğer openAsync bir "gerçek zaman uyumsuz" uygulamasının bir örneği() için işaret edebilir? Ya da yukarıdaki OpenAsync() 'in gerçek zamanlı senkronize olarak nasıl yazılabileceğini göster? – Questionaire