// Developer Express Code Central Example:
// How to update a View object from another thread.
//
// It is well known that most Windows Forms are not thread safe, and all changes to
// these controls should run (be marshaled on to) the thread processing windows
// events (the main UI thread). Worker threads are often used to do lengthy
// calculations or process asynchronously messaged events, allowing the UI to react
// to the user while these tasks are operating. This example shows how bypass this
// limitation by updating the object directly in the database, and then refreshing
// the view to reload the current object. This is a little bit tricky, but works
// quite well. Another known workaround, is marshaling actual work to the main UI
// thread, for instance in the main form. You can learn more about this in MSDN,
// Google, etc. For instance, here is a good article:
// http://weblogs.asp.net/justin_rogers/pages/126345.aspx
//
// You can find sample updates and versions for different programming languages here:
// http://www.devexpress.com/example=E1394
using System.ComponentModel;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using System.Threading;
using DevExpress.Xpo;
namespace WinSolution.Module.Win {
public partial class ChangeCurrentObjectFromAnotherThreadViewController : ViewController {
public ChangeCurrentObjectFromAnotherThreadViewController() {
InitializeComponent();
RegisterActions(components);
}
private void simpleAction1_Execute(object sender, SimpleActionExecuteEventArgs e) {
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
View.ObjectSpace.Refresh();
}
void worker_DoWork(object sender, DoWorkEventArgs e) {
Thread.Sleep(1000);
DomainObject1 obj = (DomainObject1)View.CurrentObject;
if (obj != null) {
using (UnitOfWork uow = new UnitOfWork(View.ObjectSpace.Session.DataLayer)) {
DomainObject1 copy = uow.GetObjectByKey<DomainObject1>(obj.Oid, true);
copy.Name = "test";
uow.CommitChanges();
}
}
}
}
}
// How to update a View object from another thread.
//
// It is well known that most Windows Forms are not thread safe, and all changes to
// these controls should run (be marshaled on to) the thread processing windows
// events (the main UI thread). Worker threads are often used to do lengthy
// calculations or process asynchronously messaged events, allowing the UI to react
// to the user while these tasks are operating. This example shows how bypass this
// limitation by updating the object directly in the database, and then refreshing
// the view to reload the current object. This is a little bit tricky, but works
// quite well. Another known workaround, is marshaling actual work to the main UI
// thread, for instance in the main form. You can learn more about this in MSDN,
// Google, etc. For instance, here is a good article:
// http://weblogs.asp.net/justin_rogers/pages/126345.aspx
//
// You can find sample updates and versions for different programming languages here:
// http://www.devexpress.com/example=E1394
using System.ComponentModel;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using System.Threading;
using DevExpress.Xpo;
namespace WinSolution.Module.Win {
public partial class ChangeCurrentObjectFromAnotherThreadViewController : ViewController {
public ChangeCurrentObjectFromAnotherThreadViewController() {
InitializeComponent();
RegisterActions(components);
}
private void simpleAction1_Execute(object sender, SimpleActionExecuteEventArgs e) {
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
View.ObjectSpace.Refresh();
}
void worker_DoWork(object sender, DoWorkEventArgs e) {
Thread.Sleep(1000);
DomainObject1 obj = (DomainObject1)View.CurrentObject;
if (obj != null) {
using (UnitOfWork uow = new UnitOfWork(View.ObjectSpace.Session.DataLayer)) {
DomainObject1 copy = uow.GetObjectByKey<DomainObject1>(obj.Oid, true);
copy.Name = "test";
uow.CommitChanges();
}
}
}
}
}
欢迎转载,转载请注明出处:http://www.cnblogs.com/Tonyyang/