我有一个程序会对数据库进行一些重大调用,然后更新UI。这是造成问题的原因,因为在大多数情况下,这意味着UI不响应。因此,我决定,我希望把访问数据库的函数调用和更新在一个单独的线程的UI,所以现在我有这样的事情:c#BeginInvoke问题
private delegate void CallAsyncDelegate();
private void CallGetDBValues()
{
// Call GetDatabaseValues in new thread
CallAsyncDelegate callGetDatabaseValues = new
CallAsyncDelegate(GetDatabaseValues);
BeginInvoke(callGetDatabaseValues);
}
private void GetDatabaseValues()
{
// Get lots of data here
// Update UI here
}
...
但是,它似乎毫无任何区别的UI。我在某处读到,如果要在单独的线程中运行的代码需要更新UI,那么这就是应该如何进行调用 - 这是正确的吗?难道我做错了什么?
你明白了倒退;如果您的代码已经在单独的后台线程中运行,并且您需要从中更新UI,那么您需要使用BeginInvoke方法,该方法允许您在UI线程上执行UI更新代码。就你而言,你已经在UI线程上执行了代码,但是你想要在单独的后台线程上执行工作代码。在这里寻找一个建议使用BackgroundWorker组件的答案......它是一个可以添加到UI窗体以在分离线程上执行代码的组件。 – 2010-08-02 19:34:01
您可以在BCL中使用MethodInvoker而不是定义您自己的代理 – thecoop 2010-08-02 19:39:23