Parallelism مهمة (المهام مكتبة متوازٍ)
Tكـk متوازى مكتبة (TPL)، كـ يتضمن اسمه هو bكـed على المفهوم tكـk . يشير مصطلح parallelism مهمة إلى واحد أو المزيد المهام التي تعمل بشكل متزامن. يمثل مهمة غير متزامن العملية، وأنه يشبه إنشاء مؤشر ترابط جديد أو عنصر عمل ThreadPool، ولكن في المستوى أعلى من تجريد في بعض الطرق. توفير مهام الثاني من الفوائد الأساسية:
أكثر فعالية و الاستخدام قابلة للتحجيم المزيد موارد النظام.
في قائمة في الخلفية، المهام الانتظار إلى ThreadPool، حيث تم تحسين مع الخوارزميات (مثل climbing قمة) لتحديد وضبط رقم من عمليات جزئية التي تكبير سرعة نقل البيانات. وهذا يجعل المهام الخفيفة نسبيا، ويمكنك إنشاء العديد منها إلى تمكين parallelism تفصيلية. إلى تكملة هذا، يتم استخدام خوارزميات العمل-سرقة معروف بشكل كبير لتوفير موازنة تحميل.
التحكم البرمجي أكثر من هو الممكنة مع عنصر مؤشر ترابط أو العمل.
Framework الذي تم إنشاؤه حولها والمهام بتوفير التعيين غنية من واجهات برمجة التطبيقات التي تدعم انتظار الإلغاء، continuations، معالجة استثناء قوية والمعلومات المفصلة، الجدولة المخصصة، و المزيد.
لكل من هذه الأسباب، في 4 إطار عمل.NET، المهام هي واجهة برمجة تطبيقات المفضل للكتابة متعددة مؤشرات الترابط، غير متزامنة، و المتوازية تعليمات برمجية.
قم بإنشاء مهام قيد التشغيل و ضمنياً
Parallel.Invokeأسلوب يوفر طريقة ملائمة إلى تشغيل أي عدد من عبارات عشوائية بشكل متزامن. تمرير فقط في Actionتفويض لكل عنصر من العمل. أن أسهل طريقة إلى إنشاء هذه التفويضات هو إلى استخدام تعبيرات لامدا. يمكن استدعاء التعبير لامدا أما مسمى أسلوب، أو قم بتوفير المضمنة في تعليمات برمجية. يظهر المثال التالي أساسية Invoke()استدعاء يقوم و يبدأ مهمتين التي تعمل بشكل متزامن.
ملاحظة |
---|
يستخدم هذه الوثائق تعبيرات لامدا إلى تعريف التفويضات في TPL.إذا لم تكن معتاداً على تعبيرات لامدا في C# أو Visual أساسى، راجع لامدا التعبيرات في PLINQ و TPL. |
Parallel.Invoke(Sub() DoSomeWork(), Sub() DoSomeOtherWork())
Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork());
ملاحظة |
---|
العدد Taskالمثيلات التي تم إنشاؤها في الخلفية بواسطة Parallel.Invokeهو ليس بالضرورة يساوي عدد المفوضون المتوفرة.قد تستخدم TPL تحسينات عديدة، خاصة مع عدد كبير من المفوضون. |
لمزيد من المعلومات، راجع كيفية القيام بما يلي: استخدم متوازى.Invoke إلى تنفيذ العمليات متوازٍ.
للتحكم بصورة أكبر على تنفيذ مهمة، أو إلى بإرجاع القيمة من مهمة، تحتاج إلى العمل مع Taskكائنات أكثر بوضوح.
قم بإنشاء مهام و قيد التشغيل بشكل صريح
مهمة هو تمثيلها بواسطة System.Threading.Tasks.Taskفئة. مهمة التي تقوم بإرجاع القيمة هو الممثلة حسب System.Threading.Tasks.Task<TResult>الفئة، يرث من Task. كائن مهمة hوles تفاصيل البنية التحتية، و يوفر أساليب و الخصائص التي يمكن الوصول إليها من مؤشر ترابط استدعاء خلال مدة مهمة. ل مثال، يمكنك الوصول إلى Statusخاصية لهذه مهمة في أي وقت لتحديد ما إذا كان من بدء التشغيل، قم بتشغيل الإكمال أو تم إلغاء، أو طرح يحتوي على استثناء. حالة هو تمثيلها بواسطة TaskStatusالتعداد.
عند إنشاء مهمة، يمكنك إعطائه تفويض مستخدم يغلف التعليمة البرمجية التي سيتم ينفذ المهمة. يمكن التعبير عن المفوض كـ مفوض مسماة أو الطريقة المجهولة تعبير lambda. يمكن أن تحتوي على تعبيرات لامدا مكالمة إلى أسلوب مسماة، كما هو موضح في المثال التالي.
' Create a task and supply a user delegate by using a lambda expression.
Dim taskA = New Task(Sub() Console.WriteLine("Hello from taskA."))
' Start the task.
taskA.Start()
' Output a message from the calling thread.
Console.WriteLine("Hello from the calling thread.")
' Output:
' Hello from the calling thread.
' Hello from taskA.
// Create a task and supply a user delegate by using a lambda expression.
var taskA = new Task(() => Console.WriteLine("Hello from taskA."));
// Start the task.
taskA.Start();
// Output a message from the calling thread.
Console.WriteLine("Hello from the calling thread.");
/* Output:
* Hello from the calling thread.
* Hello from taskA.
*/
يمكنك أيضا استخدام StartNewالأسلوب لإنشاء و يبدأ مهمة في عملية واحدة. Th هو هو الطريقة المفضلة لإنشاء وتشغيل المهام في حالة الإنشاء والجدولة لا يلزم أن يتم فصل. كشف Tكـk خاصية "التصنيع" ثابتة التي تقوم بإرجاع مثيل بشكل افتراضي TكـkFactory، بحيث يمكنك استدعاء الأسلوب كـ Task.Factory.StartNew(…). أيضا، في هذا مثال، لأن المهام نوع Task<double>، يكون لها كل عام Resultخاصية التي تحتوي على نتيجة الحساب. تشغيل المهام بشكل غير متزامن و قد إكمال في أي ترتيب. إذا كانت نتيجة هو الوصول إليها من قبل اكتمال احتساب، خاصية يحظر حتى القيمة هو المتوفرة.
Dim taskArray() = {Task(Of Double).Factory.StartNew(Function() DoComputation1()),
Task(Of Double).Factory.StartNew(Function() DoComputation2()),
Task(Of Double).Factory.StartNew(Function() DoComputation3())}
Dim results() As Double
ReDim results(taskArray.Length)
For i As Integer = 0 To taskArray.Length
results(i) = taskArray(i).Result
Next
Task<double>[] taskArray = new Task<double>[]
{
Task<double>.Factory.StartNew(() => DoComputation1()),
// May be written more conveniently like this:
Task.Factory.StartNew(() => DoComputation2()),
Task.Factory.StartNew(() => DoComputation3())
};
double[] results = new double[taskArray.Length];
for (int i = 0; i < taskArray.Length; i++)
results[i] = taskArray[i].Result;
لمزيد من المعلومات، راجع كيفية القيام بما يلي: إرجاع القيمة من مهمة.
أيضا، يمكنك توفير كائن الولاية اختيارياً إلى مهمة، كما هو موضح في المثال التالي:
Class MyCustomData
Public MyDate As DateTime
Public Name As String
End Class
Shared Sub TaskDemo2()
' Create the task object by using an Action(object) to pass in custom data.
Dim taskB As Task(Of Action(Of Object))
taskB = New Task(Sub(obj As Object)
Dim mydata = CType(obj, MyCustomData)
Console.WriteLine("Hello from {0}. Today is {1}.", mydata.Name, mydata.MyDate)
End Sub,
New MyCustomData With {.Name = "taskB", .MyDate = DateTime.Today}
)
' Start the task.
taskB.Start()
End Sub
' Sample Output:
' Hello from taskB. Today is 8/6/2009 12:00:00 AM.
class MyCustomData
{
public DateTime Date;
public String Name;
}
static void TaskDemo2()
{
// Create the task object by using an Action<object> to pass in custom data.
var taskB = Task.Factory.StartNew((obj) =>
{
MyCustomData data = (MyCustomData)obj;
Console.WriteLine("Hello from {0}. Today is {1}.", data.Name, data.Date);
},
new MyCustomData { Name = "taskB", Date = DateTime.Today });
// Or use the dynamic keyword to avoid having to
// create a named class to hold the data:
var taskC = Task.Factory.StartNew(state =>
{
dynamic data = state;
Console.WriteLine(data.Name);
Console.WriteLine(data.Date);
}, new { Name = "taskB", Date = DateTime.Today });
}
// Sample Output:
// Hello from taskB. Today is 8/6/2009 12:00:00 AM.
Th هو حالة هو التي تم تمريرها كوسيطة للمفوض مهمة، فإنه هو قابلة للعرض في كائن مهمة باستخدام AsyncStateخاصية.
المعرف مهمة
يتلقى كل مهمة معرفاً صحيحاً يعرفه في مجال تطبيق والتي هو يمكن الوصول إليها باستخدام Idخاصية. المعرف هو مفيدة لعرض معلومات مهمة في المصحح Studio Vهوual كدسات متوازى وإطارات مهام متوازى . ببط تاريخ الإنشاء المعرف، مما يعني أنه لم يتم إنشائه حتى أنه يتم طلب؛ ولذلك مهمة قد يكون معرف آخر في كل مرة يتم تشغيل البرنامج. لمزيد من المعلومات حول عرض "معرفات المهام" في مصحح الأخطاء، راجع باستخدام نافذة المكدسات المتوازية:و باستخدام نافذة المكدسات المتوازية:.
خيارات إنشاء مهمة
توفير واجهات برمجة التطبيقات معظم إنشاء مهام التحميلات الزائدة التي تقبل معلمة TaskCreationOptions بواسطة تحديد واحد هذه خيارات، تقوم بإرشاد جدولة المهام تشغيل كيفية جدولة مهمة في تجمع مؤشرات الترابط. يسرد الجدول التالي عدة خيارات لإنشاء مهمة.
العنصر |
الوصف |
---|---|
None |
الخيار الافتراضي عند عدم وجود خيار هو المحدد. تستخدم جدولة heuristics الافتراضي الخاص به إلى جدولة مهمة. |
PreferFairness |
يحدد أن مهمة يجب أن تتم جدولة المهام المنشأة من شكل أبكر تصبح أكثر ملاءمة إلى سيتم تنفيذها بشكل أبكر، وستكون أكثر ملاءمة المهام التي تم إنشاؤها بالإصدار الأحدث إلى التنفيذ لاحقاً. |
LongRunning |
يحدد أن مهمة يمثل عملية تشغيلها لفترة طويلة |
AttachedToParent |
تعيين أنه يجب تاريخ الإنشاء tكـk كـ تابع مرفقة ل Tكـk الحالي، في حالة وجودها. لمزيد من المعلومات، راجع المهام التابعة و مهام متداخلة. |
يمكن ضم الخيارات بواسطة استخدام أحادي المعامل ORتشغيل. يوضح المثال التالي مهمة يحتوي على LongRunningPreferFairness خيار.
Dim task3 = New Task(Sub() MyLongRunningMethod(),
TaskCreationOptions.LongRunning Or TaskCreationOptions.PreferFairness)
task3.Start()
var task3 = new Task(() => MyLongRunningMethod(),
TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness);
task3.Start();
إنشاء مهمة Continuations
TaskContinueWith()أسلوب و TaskContinueWith()أسلوب ترك تعيين مهمة إلى أن تبدأ عند compتركes المهمة antecedent . تفويض مهمة متابعة هو تمرير مرجع إلى antecedent، حيث أنه يمكن فحص حالة الخاصة به. بالإضافة إلى ذلك، يمكن أن تكون القيمة معرفة من قبل مستخدم pكـsed من antecedent لمتابعة الخاص به في Resultخاصية، حيث يمكن أن يعمل إخراج antecedent كـ الإدخال لمتابعة. في المثال التالي، getDataهو تم تشغيله بواسطة رمز البرنامج، ثم analyzeDataهو يبدأ تشغيلها تلقائياً عند getDataاكتمال، و reportDataهو بدأ متى analyzeDataتكمل. getDataيعطي كـ الناتج صفيفة بايت، والذي هو pكـsed فيanalyzeData. analyzeDataيعالج هذا الصفيف وإرجاع نتيجة نوعه هو الاستدلال من نوع الإرجاعAnalyzeأسلوب. reportDataيأخذ إدخال منanalyzeData، وتعطي نتيجة نوعه هو الاستدلال بطريقة مشابهة والتي يتم توفيرها إلى في البرنامجResultخاصية.
Dim getData As Task(Of Byte()) = New Task(Of Byte())(Function() GetFileData())
Dim analyzeData As Task(Of Double()) = getData.ContinueWith(Function(x) Analyze(x.Result))
Dim reportData As Task(Of String) = analyzeData.ContinueWith(Function(y As Task(Of Double)) Summarize(y.Result))
getData.Start()
System.IO.File.WriteAllText("C:\reportFolder\report.txt", reportData.Result)
Task<byte[]> getData = new Task<byte[]>(() => GetFileData());
Task<double[]> analyzeData = getData.ContinueWith(x => Analyze(x.Result));
Task<string> reportData = analyzeData.ContinueWith(y => Summarize(y.Result));
getData.Start();
//or...
Task<string> reportData2 = Task.Factory.StartNew(() => GetFileData())
.ContinueWith((x) => Analyze(x.Result))
.ContinueWith((y) => Summarize(y.Result));
System.IO.File.WriteAllText(@"C:\reportFolder\report.txt", reportData.Result);
ContinueWhenAll()الأسلوب و ContinueWhenAny()أسلوب ترك تابعت من عدة مهام. للمزيد من المعلومات، راجع متابعة المهام وكيفية القيام بما يلي: ربط مهام متعددة مع Continuations.
إنشاء فصل مهام متداخلة
عندما مستخدم الرموز التي هو التي تعمل في مهمة إنشاء مهمة جديدة وعدم تحديد خيار AttachedToParent، والمهمة الجديدة غير متزامنة مع المهمة الخارجية بأي طريقة خاص. تسمى تلك المهام على فصل مهام متداخلة . يظهر المثال التالي الذي يقوم بإنشاء مهمة واحد فصل المهام المتداخلة.
Dim outer = Task.Factory.StartNew(Sub()
Console.WriteLine("Outer task beginning.")
Dim child = Task.Factory.StartNew(Sub()
Thread.SpinWait(5000000)
Console.WriteLine("Detached task completed.")
End Sub)
End Sub)
outer.Wait()
Console.WriteLine("Outer task completed.")
' Output:
' Outer task beginning.
' Outer task completed.
' Detached child completed.
var outer = Task.Factory.StartNew(() =>
{
Console.WriteLine("Outer task beginning.");
var child = Task.Factory.StartNew(() =>
{
Thread.SpinWait(5000000);
Console.WriteLine("Detached task completed.");
});
});
outer.Wait();
Console.WriteLine("Outer task completed.");
/* Output:
Outer task beginning.
Outer task completed.
Detached task completed.
*/
لاحظ أنه لا ينتظر مهمة الخارجية مهمة المتداخلة إلى كاملة.
قم بإنشاء مهام فرع
عندما المستخدم الرموز التي هو التي تعمل في إحدى مهام بإنشاء مهمة باستخدام الخيار AttachedToParent، والمهمة الجديدة هو المعروفة كمهمة تابعة إنشاء المهمة، والذي هو يعرف المهمة الأصلية. يمكنك استخدام AttachedToParentخيار إلى parallelism ضمانات مهمة مصنفة، لأن المهمة الأصلية ضمنياً ينتظر الجميع فرع لإكمال المهام. يظهر المثال التالي الذي يقوم بإنشاء مهمة واحد المهمة التابعة:
Dim parent = Task.Factory.StartNew(Sub()
Console.WriteLine("Parent task beginning.")
Dim child = Task.Factory.StartNew(Sub()
Thread.SpinWait(5000000)
Console.WriteLine("Attached child completed.")
End Sub,
TaskCreationOptions.AttachedToParent)
End Sub)
outer.Wait()
Console.WriteLine("Parent task completed.")
' Output:
' Parent task beginning.
' Attached child completed.
' Parent task completed.
var parent = Task.Factory.StartNew(() =>
{
Console.WriteLine("Parent task beginning.");
var child = Task.Factory.StartNew(() =>
{
Thread.SpinWait(5000000);
Console.WriteLine("Attached child completed.");
}, TaskCreationOptions.AttachedToParent);
});
parent.Wait();
Console.WriteLine("Parent task completed.");
/* Output:
Parent task beginning.
Attached task completed.
Parent task completed.
*/
لمزيد من المعلومات، راجع المهام التابعة و مهام متداخلة.
جارى الإنتظار تشغيل المهام
System.Threading.Tasks.Taskالنوع و System.Threading.Tasks.Task<TResult>توفير نوع التحميلات الزائدة العديد من Waitالطريقة التي تسمح لك بانتظار مهمة إلى كاملة. بالإضافة إلى ذلك، التحميلات الزائدة من ثابتة TaskWaitAll()الأسلوب و TaskWaitAny()أسلوب ترك الانتظار لأي من أو الجميع صفيفة مهام ل compتركe.
بشكل عام، هل الانتظار لإحدى مهام ل واحد الأسباب التالية:
مؤشر ترابط الرئيسي يعتمد على النتيجة النهائية التي تم حسابها بواسطة مهمة.
تحتاج إلى معالجة الاستثناءات التي قد تم طرح من مهمة.
يظهر المثال التالي النمط الأساسي الذي لا يتضمن معالجة استثناء.
Dim tasks() =
{
Task.Factory.StartNew(Sub() MethodA()),
Task.Factory.StartNew(Sub() MethodB()),
Task.Factory.StartNew(Sub() MethodC())
}
Task.WaitAll(tasks)
Task[] tasks = new Task[3]
{
Task.Factory.StartNew(() => MethodA()),
Task.Factory.StartNew(() => MethodB()),
Task.Factory.StartNew(() => MethodC())
};
Task.WaitAll(tasks);
على سبيل مثال يظهر معالجة استثناء، راجع مقطع التالي.
تمكنك بعض التحميلات الزائدة على تحديد مهلة، وخذ الآخرين إضافى CancellationTokenكمعلمة إدخال، حيث يمكن أن يتم إلغاء الانتظار نفسه برمجياً أو استجابة إلى إدخال مستخدم.
When you wait on a task, you implicitly wait on all children of that task that were created by using the TaskCreationOptions AttachedToParent option. Waitبإرجاع مباشرة إذا تم مكتمل مهمة مسبقاً. سوف يتم طرح أي استثناءات من قبل إحدى مهام بواسطة Waitالأسلوب، حتى لو Waitتم استدعاء الأسلوب بعد إتمام مهمة.
لمزيد من المعلومات، راجع كيفية القيام بما يلي: الانتظار تشغيل واحد أو أكثر من مهام إلى اكتمال.
معالجة استثناءات في مهام
عندما يطرح مهمة أو أكثر استثناءات، استثناءات يتم التفاف في AggregateException. يتم نشر هذا استثناء إلى مؤشر ترابط الذي يربط بالمهمة، وهو عادة مؤشر ترابط الذي يتم تشغيل مهمة أو يحاول الوصول إلى خاصية نتيجة للمهمة. يعمل هذا سلوك لفرض برنامج.NET Framework يجب تفكيك نهج الجميع unhandled الاستثناءات بشكل افتراضي باستمرار للعملية. استدعاء تعليمات برمجية يمكن hوle الاستثناءات باستخدام Wait، WaitAll()، أو WaitAny()أسلوب أو Result()خاصية تشغيل مهمة أو مجموعة من المهام، و إحاطة Waitالأسلوب في محاولة الالتقاط حظر.
مؤشر الترابط ضم أيضا معالجة الاستثناءات بواسطة الوصول إلى Exceptionخاصية قبل مهمة هو-تجميع البيانات المهملة. بواسطة الوصول إلى ترتيب هو خاصية، يمكنك منع استثناء غير معالج من تشغيل سلوك نشر استثناء الذي tears باستمرار العملية عند الكائن هو إنهاؤه.
ل المزيد معلومات حول الاستثناءات والمهام، راجع استثناء معالجة (مكتبة متوازى المهام)و كيفية القيام بما يلي: معالجة استثناءات طرح بواسطة المهام.
يتم إلغاء الأمر المهام
Taskفئة يدعم الإلغاء التعاونية و هو متكاملة بشكل كامل مع System.Threading.CancellationTokenSourceالفئة و System.Threading.CancellationTokenفئة جديدة في الإصدار الرابع من برنامج.NET Framework. العديد من المنشئات في System.Threading.Tasks.Taskفئة الحصول CancellationTokenكمعلمات إدخال. العديد من StartNew()التحميلات الزائدة أيضا الحصول CancellationToken.
يمكنك إنشاء الرمز المميز، و بإصدار طلب الإلغاء في وقت لاحق بعض، باستخدام CancellationTokenSourceفئة. تمرير إلى ken إلى Taskكالوسيطة، وأيضا المرجع نفس إلى ken بتفويض مستخدم الخاص بك، مما أدى المطورة من الاستجابة إلى طلب الإلغاء. للمزيد من المعلومات، راجع إلغاء مهمة وكيفية القيام بما يلي: إلغاء الأمر مهمة و الخاص الأطفال.
فئة TaskFactory
TaskFactoryفئة يوفر وظائف ثابتة التي تغلف بعض الأنماط عام لإنشاء وتشغيل ومهام ومتابعة المهام.
النمط الأكثر شيوعاً هو StartNew، الذي يقوم بإنشاء وبدء مهمة في عبارة واحدة. لمزيد من المعلومات، راجع StartNew().
عندما كنت إنشاء مهام متابعة من antecedents متعددة، استخدم ContinueWhenAllأسلوب أو ContinueWhenAnyالأسلوب. لمزيد من المعلومات، راجع متابعة المهام.
إلى تغليف "طراز برمجة غير متزامن" BeginXو EndXالطرق في Taskأو Task<TResult>المثيل، استخدم FromAsync()الوظائف. لمزيد من المعلومات، راجع برمجة TPL و.NET التقليدية غير متزامن.
افتراضي TaskFactoryهو يمكن الوصول إليها كخاصية ثابتة تشغيل Taskفئة أو Task<TResult>class. يمكنك أيضا إنشاء مثيل TaskFactoryمباشرة و تحديد خيارات متنوع والتي تضمين CancellationToken، TaskCreationOptionsخيار، TaskContinuationOptionsخيار، أو TaskScheduler. يتم تحديد أي خيارات عندما تقوم بتاريخ الإنشاء المصنع مهمة يتم تطبيقها على الجميع المهام التي يقوم بإنشائها، ما لم تكن المهمة هو التي تم إنشاؤها باستخدام TaskCreationOptionsالتعداد، الذي الحالة خيارات يمنع للمهمة تلك الخاصة بالمصنّع المهمة.
المهام بدون مفوضون
في بعض الحالات، قد تحتاج إلى استخدام Taskلتغليف بعض العمليات غير المتزامنة التي هو تنفيذه من قبل مكون خارجية بدلاً من المفوض مستخدم الخاص بك. إذا كانت العملية هو استناداً إلى النمط غير متزامن برمجة طراز البدء/الانتهاء، يمكنك استخدام FromAsync()الأساليب. إذا كان هذا هو ليس هذه الحالة، يمكنك استخدام بإجراء التفاف للعملية في مهمة وبذلك الحصول على بعض الفوائد TaskCompletionSourceالكائن Taskيعتمد قابلية البرمجة، على سبيل المثال، لنشر استثناء و continuations. لمزيد من المعلومات، راجع TaskCompletionSource.
Schedulers مخصص
بمعظم مطوري التطبيقات أو المكتبة لا الرعاية المعالج الذي تشغله مهمة وكيف أنه يتزامن مع عمله بمهام غير ذلك أو كيف أنها هو على System.Threading.ThreadPool. حيث تتطلب فقط من ينفذ ككفاءة قدر الإمكان تشغيل الكمبيوتر مضيف. إذا كنت تطلب المزيد من التحكم التفصيلية تفاصيل الجدولة، مكتبة متوازى المهام يسمح لك تكوين بعض الإعدادات تشغيل جدولة المهام الافتراضي، وحتى لك بتوفير جدولة مخصصة. لمزيد من المعلومات، راجع TaskScheduler.
بنيات بيانات ذات الصلة
TPL لدى عدة جديدة العامة أنواع المفيدة في كلا متوازى والسيناريوهات متسلسلة. وتشمل هذه الفئات مجموعة مؤشر ترابط-آمن وسريعة وقابلة للتحجيم عدة في System.Collections.Concurrentمساحة الاسم، وأنواع مزامنة جديدة متعددة، ل مثال، SemaphoreLockو System.Threading.ManualResetEventSlim، التي تعتبر أكثر فعالية من المهام السابقة الخاصة بهم لأنواع معينة من أحمال العمل الموزعة. أنواع غير ذلك جديدة في إطار عمل.NET الإصدار 4، على سبيل المثال، System.Threading.Barrierو System.Threading.SpinLock، قم بتوفير الوظائف التي كانت غير متوفرة في الإصدارات السابقة. لمزيد من المعلومات، راجع بنيات بيانات ل متوازى البرمجة.
مواضيع ذات صلة
Title |
الوصف |
توضح هذه المقالة كيفية عمل continuations. |
|
توضح هذه المقالة الفرق بين المهام التابعة ومهام متداخلة. |
|
تتناول هذه المقالة دعم الإلغاء ضمن Taskالكائن. |
|
توضح هذه المقالة كيفية استثناءات تشغيل مؤشرات ترابط متزامنة يتم التعامل معها. |
|
كيفية القيام بما يلي: استخدم متوازى.Invoke إلى تنفيذ العمليات متوازٍ |
توضح هذه المقالة كيفية إلى استخدام [Overload:][System.Threading.Tasks.Parallel.Invoke]. |
توضح هذه المقالة كيفية إلى إرجاع قيم من المهام. |
|
كيفية القيام بما يلي: الانتظار تشغيل واحد أو أكثر من مهام إلى اكتمال |
توضح هذه المقالة كيفية إلى الانتظار تشغيل المهام. |
توضح هذه المقالة كيفية إلى إلغاء الأمر المهام. |
|
توضح هذه المقالة كيفية إلى معالجة الاستثناءات طرح حسب المهام. |
|
توضح هذه المقالة كيفية إلى ينفذ مهمة عند اكتمال مهمة أخرى. |
|
توضح هذه المقالة كيفية إلى تستخدم المهام إلى تجاوز شجرة بثنائي. |
|
توضح هذه المقالة كيفية استخدام ParallelFor()و ParallelForEach()لإنشاء متوازى حلقات عبر بيانات. |
|
الارتباطات إلى المستندات التي تصف أوجه.NET المتوازية البرمجة. |