async
yöntemi başlatıldığında, geçerli eşitleme içeriğini yakalar. Bu sorunu çözmenin bir yolu, istisnayı yakalayan kendi senkronizasyon bağlamınızı oluşturmaktır. Yukarıdaki catch
yılında
public class AsyncSynchronizationContext : SynchronizationContext
{
public override void Send(SendOrPostCallback d, object state)
{
try
{
d(state);
}
catch (Exception ex)
{
// Put your exception handling logic here.
Console.WriteLine(ex.Message);
}
}
public override void Post(SendOrPostCallback d, object state)
{
try
{
d(state);
}
catch (Exception ex)
{
// Put your exception handling logic here.
Console.WriteLine(ex.Message);
}
}
}
sizin istisna işleme mantığı koyabilirsiniz: Burada
nokta senkronizasyon bağlam mesajlar parçacığı havuzuna geri arama, ama bunun geçici bir try/catch ile olmasıdır.
Daha sonra, bu mekanizma ile async
yöntemlerini yürütmek istediğiniz her iş parçacığı (SynchronizationContext.Current
[ThreadStatic]
Aslında), geçerli eşitleme bağlamını ayarlamak gerekir:
SynchronizationContext.SetSynchronizationContext(new AsyncSynchronizationContext());
tam Main
örnek:
class Program
{
static void Main(string[] args)
{
SynchronizationContext.SetSynchronizationContext(new AsyncSynchronizationContext());
ExecuteAsyncMethod();
Console.ReadKey();
}
private static async void ExecuteAsyncMethod()
{
await AsyncMethod();
}
private static async Task AsyncMethod()
{
throw new Exception("Exception from async");
}
}
Bir uyumsuzluk yöntemi bekleniyorsa, istisna onu bekleyen kod içine atılır. İşlenmeyen istisnalar, bu yöntem yalnızca "void" dönüyorsa davranır. Bu, "async void" yöntemlerini mümkün olduğunca kullanmamak için bir neden. – svick
@svick 'async void' yöntemleri deterministik davranışla sonuçlanır; Bir özel durumla sonuçlanan ve görevi beklemeyen bir Görev işlevi döndürme işlevi, çöp toplayıcının çalıştığı gelecekte gelecekte bazı yarıda noktalarında "UnobservedTaskException" olayını yükseltir ve bu hiçbir şey yapmazsa, programın sessizce devam etmesini sağlar. eğer her şey yolundaysa. Sorun “async void” yöntemleriyle değil, sadece gerçek problemi ortaya çıkarmaktadır. Bir "async" yönteminden bir 'Task' döndüren işlevi çağırmazsanız, yanlış bir şey yaptığınız için iyi bir şans vardır. – hvd
Bu arada, sadece "iyi şans" çünkü istisnalar atmak için uygun olmayan birkaç istisna (cezaya çarptırılmadı) vakası var, ama çok fazla değil. – hvd