كيفية القيام بما يلي: قم بتحديث لطراز UML من الخلفية لمؤشر الترابط
في بعض الأحيان يكون مفيداً إلى إجراء تغييرات إلى طراز في مؤشر ترابط الخلفية. على سبيل المثال، إذا كنت تقوم بتحميل المعلومات من مورد خارجي بطيئة، يمكنك استخدام مؤشر ترابط الخلفية إلى supervise التحديثات. وهذا يسمح للمستخدم إلى راجع كل تحديث بمجرد حدوث ذلك.
ومع ذلك، يجب أن تكون على علم بتخزين UML هو مسار غير التنفيذ آمن. تعتبر مهمة الاحتياطات التالية:
كل تحديث لنموذج أو مخطط يجب أن تتم في مؤشر ترابط واجهة مستخدم. يجب استخدام مسار التنفيذ الخلفية ControlInvoke()أو DispatcherInvoke()إلى وجود مؤشر ترابط واجهة المستخدم بإجراء تحديثات الفعلي.
إذا قمت بالتجميع سلسلة من التغييرات في عملية واحدة، ننصح بمنع مستخدم من تحرير النموذج أثناء المعاملة هو قيد التقدم. وإلا، أي ستصبح التعديلات التي تم إجراؤها من قبل مستخدم جزء من نفس العملية. يمكنك منع مستخدم من القيام بتغييرات عن طريق إظهار Modal صندوق حوار. إذا أردت، يمكنك توفير زر "إلغاء الأمر" في صندوق حوار. يمكن المستخدم من مشاهدة التغييرات كـ أن يحدث.
المثال
يستخدم هذا المثال مؤشر ترابط الخلفية إلى إجراء العديد من التغييرات إلى طراز. صندوق حوار هو مستخدم للمستخدم أثناء مؤشر ترابط باستبعاد هو قيد التشغيل. في ترتيب هو مثال بسيط، لا يوجد زر "إلغاء الأمر" هو المتوفرة في صندوق الحوار. ومع ذلك، فسيكون سهلاً إلى إضافة هذه الميزة.
لتشغيل المثال
إنشاء معالج أوامر في مشروع C# كـ الموصوفة في كيفية القيام بما يلي: تعريف أمر قائمة على مخطط طراز.
تأكد من أن مشروع يتضمن المراجع إلى هذه تجميعات:
Microsoft.VisualStudio.ArchitectureTools.Extensibility
Microsoft.VisualStudio.Modeling.Sdk.10.0
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.10.0
Microsoft.VisualStudio.Uml.Interfaces
النظام.ComponentModel.إنشاء
اطارات رسم النظام
إضافة نموذج Windows باسم ProgressForm إلى مشروع. فيجب أن يعرض رسالة تنص على أن تكون التحديثات في التقدم. لم يكن إلى وجود أي عناصر تحكم غير ذلك.
إضافة C# ملف الذي يحتوي على التعليمات البرمجية التي هو يظهر بعد الخطوة 7.
قم ببناء المشروع وتشغيله.
مثيل جديد Visual Studioسيبدأ في الوضع تجريبية.
قم بإنشاء أو فتح فئة UML مخطط في نسخة تجريبية من Visual Studio.
ينقر على اليمين في أي مكان في مخطط ل UML فئة و ثم انقر فوق إضافة عدة فئات UML.
عدة مربعات فئة جديدة تظهر في مخطط، واحداً بعد الآخر في فواصل زمنية من نصف ثانية.
using System;
using System.ComponentModel;
using System.ComponentModel.Composition;
using System.Threading;
using System.Windows.Forms;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
using Microsoft.VisualStudio.Uml.Classes;
namespace BackgroundThreadProgressUI
{
[Export(typeof(ICommandExtension))]
[ClassDesignerExtension]
class UmlClassAdderCommand : ICommandExtension
{
[Import]
IDiagramContext context { get; set; }
[Import]
IServiceProvider serviceProvider { get; set; }
[Import]
ILinkedUndoContext linkedUndoContext { get; set; }
// Called when the user runs the command.
public void Execute(IMenuCommand command)
{
// The form that will exclude the user.
ProgressForm form = new ProgressForm();
// System.ComponentModel.BackgroundWorker is a
// convenient way to run a background thread.
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += delegate(object sender, DoWorkEventArgs args)
{
// This block will be executed in a background thread.
IClassDiagram diagram = context.CurrentDiagram as IClassDiagram;
IModelStore store = diagram.ModelStore;
const int CLASSES_TO_CREATE = 15;
// Group all the changes together.
using (ILinkedUndoTransaction transaction = linkedUndoContext.BeginTransaction("Background Updates"))
{
for (int i = 1; i < CLASSES_TO_CREATE; i++)
{
if (worker.CancellationPending)
return; // No commit - undo all.
// Create model elements using the UI thread by using
// the Invoke method on the progress form. Always
// modify the model and diagrams from a UI thread.
form.Invoke(new MethodInvoker(delegate()
{
IClass newClass = store.Root.CreateClass();
newClass.Name = string.Format("NewClass{0}", i);
diagram.Display(newClass);
}));
// Sleep briefly so that we can watch the updates.
Thread.Sleep(500);
}
// Commit the transaction or it will be rolled back.
transaction.Commit();
}
};
// Close the form when the thread completes.
worker.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs args)
{
form.Close();
};
// Start the thread before showing the modal progress dialog.
worker.RunWorkerAsync();
// Show the form modally, parented on VS.
// Prevents the user from making changes while in progress.
form.ShowDialog();
}
public void QueryStatus(IMenuCommand command)
{
}
public string Text
{
get { return "Add several classes"; }
}
}
}
إلى يسمح للمستخدم إلى إلغاء مؤشر ترابط في المثال
إضافة زر "إلغاء الأمر" إلى مربع حوار التقدم.
قم بإضافة التعليمة البرمجية التالية إلى التقدم صندوق حوار:
public event MethodInvoker Cancel;
في أسلوب ينفذ()، قم بإدراج هذا الخط بعد إنشاء النموذج:
form.Cancel += delegate() { worker.CancelAsync(); };
وظائف غير ذلك للوصول إلى واجه المستخدم مؤشر الترابط
إذا لم تكن ترغب في إنشاء صندوق حوار، فيمكنك الوصول عنصر تحكم الذي يعرض المخطط:
DiagramView uiThreadHolder = context.CurrentDiagram.GetObject<Diagram>().ActiveDiagramView;
يمكنك استخدام uiThreadHolder.Invoke()إلى تنفيذ العمليات في مؤشر ترابط UI.