2011-05-08 74 views
1

你好,我有以下问题。我需要像“锁定”这样的东西来让我的程序等待一个事件。我有一些基于事件的数据库访问。所以,如果我想从数据库的东西,做一些事情上我写:等待事件。如何不冻结gui

void getData() 
{ 
    ... 
    ... 
    getMyDataFromDbPlease(); 
} 

void responseEvent(parameters...) 
{ 
    //Ok i have my data, now i do something on it 
    ... 
    ... 
} 

所以,如果我有大的逻辑,我必须把它分成两个部分。如果我想在一个alghoritm中获得5次数据,我必须将它分成6块。

所以,我想是这样的:

void getData() 
{ 
    ... 
    ... 
    getMyDataFromDbPlease(); 

    //somehow wait for data here 

    getMyDataFromDbPlease(); 
    ... 
    ... 
} 

但我想这种神奇的等待不是冻结我的GUI。我怎样才能达到目的?我在wpf上工作。

回答

0

尝试将代码放在单独的线程中。 但是不要忘记,您必须使用Dispatcher.Invoke()来访问GUI。或者,您可以将GUI绑定到在单独线程中更改的变量。

3

你可以使用一个后台任务,您的电话连线到数据库,然后派遣实际更新回到你的UI线程:

// create a background task to load data without blocking the UI 
Task.Factory.StartNew(() => 
{ 
    var data = getData(); // call to DB or whatever 

    // invoke user code on the main UI thread 
    Dispatcher.Invoke(new Action(() => 
    { 
    doSomethingWithData(); 
    })); 
}); 
+1

我认为应该在这里,如果你是从一个执行此这个类不是一个wpf组件,而你没有一个Dispatcher对象来操作。相反,你可以使用像这样的东西:'Application.Current.Dispatcher.Invoke(...'。 – Ben 2011-05-08 15:21:43