تجاوز تنفيذ مهمتين متزامنتين في C#
في عالم البرمجة بلغة C#، قد تحتاج أحياناً إلى تخطي بعض المهام المعلقة أو المهام التي تأخذ وقتاً طويلاً، خاصة عند التعامل مع واجهات المستخدم التفاعلية حيث يتطلع المستخدمون للتفاعل السلس. في هذا المقال، سنستعرض كيفية تجاوز مهمتين باستخدام await
بطريقة فعالة، مما يساعد على تحسين تجربة المستخدم وتسريع سير العملية.
فهم التعامل مع المهام في C#
تُعتبر المهام (Tasks) في C# جزءًا أساسيًا من البرمجة غير المتزامنة، حيث تتيح لنا تنفيذ عمليات متعددة في الوقت نفسه دون الحاجة إلى الانتظار حتى تنتهي كل عملية. قد يحدث أن تريد تخطي مهام معينة إذا تم استيفاء شروط معينة، مثل الضغط على زر "تخطي" أثناء مشاهدة فيديو. هنا، نواجه تحدياً يتمثل في كيفية معالجة هذه السيناريوهات.
كيف يمكنني تخطي مهمتين باستخدام Await؟
لنفترض أنك في موقف تريد فيه مراقبة مهمتين: تشغيل فيديو وتأخير محدد، مع إمكانية تخطيهما إذا حدثت حالة معينة مثل ضغط الزر. بدلاً من استخدام Task.WaitAny
التقليدية، يمكنك استخدام UniTask.WhenAny
التي تمكنك من معرفة المهمة التي انتهت أولاً.
var index1 = await UniTask.WhenAny(UniTask.Delay(7140), UniTask.WaitUntil(() => _isSkip == true));
if (index1 == 1) {
// تم الضغط على تخطي أثناء الفيديو الأول
} else {
var late = Media.VideoPlay("video2");
var index2 = await UniTask.WhenAny(UniTask.Delay(delay), UniTask.WaitUntil(() => _isSkip == true));
if (index2 == 1) {
// تم الضغط على التخطي أثناء الفيديو الثاني
}
}
هنا، استخدمنا UniTask.WhenAny
لمراقبة أي من المهام قد تكتمل أولاً. إذا تم الضغط على زر التخطي أثناء الفيديو الأول، سيتم التعامل مع ذلك على الفور، وإذا لم يتم الضغط، يتم تشغيل الفيديو الثاني.
استخدام CancellationToken لتحسين الأداء
من المهم أن نلاحظ أن المهام الأخرى ستستمر حتى بعد استيفاء الشرط، لذا نحن بحاجة إلى تنفيذ آلية لإلغاء هذه المهام. يمكن القيام بذلك باستخدام CancellationToken
. يمكننا تمرير CancellationToken
عند إنشاء مهام UniTask
، مما يتيح لك إلغاء تنفيذ المهام المعلقة.
var cancelTokenSource = new CancellationTokenSource();
var index1 = await UniTask.WhenAny(
UniTask.Delay(7140, CancelToken: cancelTokenSource.Token),
UniTask.WaitUntil(() => _isSkip, CancelToken: cancelTokenSource.Token)
);
if (index1 == 1) {
cancelTokenSource.Cancel(); // إلغاء المهام الأخرى إذا تم الضغط على التخطي
}
بهذا الشكل، يمكنك التحكم في إلغاء المهام عند الحاجة، مما يحسن من كفاءة الأكواد لديك.
تفصيل أكثر للطرق المتاحة
يمكنك أيضًا تقسيم التعليمات البرمجية إلى دوال مستقلة، مما يجعل من السهل إدارتها. على سبيل المثال، يمكنك إنشاء دالة PlayBothVideos
التي تقوم بتشغيل الفيديو الأول والثاني، ودالة أخرى CheckForSkip
التي تتأكد من إمكانية التخطي. يمكن أن يبدو الكود كالتالي:
private async UniTask PlayBothVideos(CancellationToken token) {
try {
await UniTask.Delay(7140, CancelToken: token);
var delay = Media.VideoPlay("video2");
await UniTask.Delay(delay, CancelToken: token);
} catch (OperationCanceledException) {
// تم إلغاء العملية بسبب التخطي
}
}
بهذا الشكل، لديك دالة مخصصة للتعامل مع تشغيل الفيديو، مما يسهل عليك فهم إدارة الحالة.
الخلاصة
تجاوز مهمتين في C# باستخدام await
هو مفهوم قوي يمكن أن يعزز تجربة المستخدم. من خلال استخدام UniTask.WhenAny
وCancellationToken
، يمكنك ضمان أن البرنامج يتفاعل بسلاسة مع متطلبات المستخدم، مثل تخطي الفيديوهات المملة. تساهم هذه التقنيات في تحسين الأداء وجعل البرمجة أكثر فعالية. يشكل هذا السيناريو جزءًا من استراتيجيات البرمجة غير المتزامنة، والتي تعتبر ضرورية في تطوير التطبيقات الحديثة.
باختصار، إذا كنت تبحث عن طرق فعالة لتخطي مهام معنية في C#، فإن استخدام الأساليب الصحيحة يمكن أن يكون له تأثير كبير على كفاءة مشروعك.