async/await: متى نرجع Task ومتى نرجع void في C#؟
مرحبًا أيها الزملاء! لقد بدأت في تعلم البرمجة غير المتزامنة في C# وواجهت بعض الصعوبات في الفهم. أستخدم .NET 4.5 وأكتب تطبيق WPF. عندما أجعل الطريقة غير متزامنة باستخدام الكلمة المفتاحية async، لا أفهم دائمًا أي نوع من أنواع الإرجاع يجب أن أختار: Task أم void؟
على سبيل المثال، لدي زر يقوم بتحميل البيانات:
```csharp
private async void Button_Click(object sender, RoutedEventArgs e)
{
await LoadDataAsync();
}
```
يبدو أن هذا يعمل. لكنني رأيت في بعض الأمثلة يكتبون `async Task` بدلاً من `async void`. ما الفرق؟ ولماذا يشتكي المترجم أحيانًا عندما أحاول جعل `async void` طريقة ليست معالج حدث؟
كما حاولت إنشاء طريقة تنتظر فقط:
```csharp
public async void WaitAndLog()
{
await Task.Delay(1000);
Console.WriteLine("Done");
}
```
أستدعيها هكذا: `WaitAndLog();` — وهذا يعمل. لكن قيل لي أن هذه ممارسة سيئة. هل يمكنكم شرح متى يجب استخدام أي خيار؟ وماذا سيحدث إذا أخطأت؟