关闭

XAF 如何用其他线程更新对象(转载)

584人阅读 评论(0) 收藏 举报

转自:http://www.cnblogs.com/Tonyyang/archive/2010/08/03/1790950.html

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->// 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();
                }
            }
        }
    }
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:193661次
    • 积分:3080
    • 等级:
    • 排名:第11257名
    • 原创:106篇
    • 转载:40篇
    • 译文:5篇
    • 评论:34条
    文章分类
    最新评论