מאפייני הבעיה

4.6 Framework של .NET נוסף enum סוג ערך חדש, RunContinuationsAsynchronously, enums TaskCompletionSource ו- TaskCreationOptions . ערך זה כופה על משימות להפעלה באופן לא מסונכרן, ומסייעת זו כדי למנוע מצבים של מבוי סתום. עם זאת, התגלתה בעיה שבה, מתעלמת האפשרות עבור כמה סוגים מסוימים של continuations (במסוימת בעת Task.WhenAll, Task.WhenAnyאו TaskExtensions.Unwrap ליצור את continuations),. לכן, ייתכן continuations ימשיכו לפעול באופן סינכרוני.

הדוגמה הבאה מציגה את הבעיה. אם הערך RunContinuationsAsynchronously היו פועלים כהלכה, הליך המשנה שני מזהי המודפסים מחוץ לעולם לא יהיו זהות, מאחר תמיד ניתן לתזמן את ההמשך אל הליכי משנה שונים.

using System;using System.Threading;
using System.Threading.Tasks;

class Program
{
static void Main()
{
var mres = new ManualResetEventSlim();

Console.WriteLine(Environment.CurrentManagedThreadId);

var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);

var t = Task.WhenAll(tcs.Task);

t.ContinueWith(delegate
{
Console.WriteLine(Environment.CurrentManagedThreadId);
mres.Set();
}, TaskContinuationOptions.ExecuteSynchronously);

tcs.SetResult(true);
mres.Wait();
}
}

פתרון

אין כעת דרך לעקוף בעיה זו. הצוות של Microsoft .NET Framework הוא עובד על פתרון כדי לכלול בעדכון עתידי.


זקוק לעזרה נוספת?

הרחב את הכישורים שלך
סייר בהדרכה
קבל תכונות חדשות לפני כולם
הצטרף למשתתפי Microsoft insider

האם מידע זה היה שימושי?

עד כמה אתם מרוצים מאיכות השפה?
מה השפיע על החוויה שלכם?

תודה על המשוב!

×