1

我必须加载一个窗口,并且Window_Loaded必须加载一些变量并将其显示在 Window 上。

private void Window_Loaded_1(object sender, RoutedEventArgs e)
{         
    BackgroundWorker worker = new BackgroundWorker();

    worker.DoWork += (o, ea) =>
    {
        try
        {
            //code to download some variables which will show on UI of Window Loading
        }
        catch (Exception ex)
        {
            //The calling thread cannot access this object because a different thread owns it.
        }
    };

    worker.RunWorkerCompleted += (o, ea) =>
    {

    };

    worker.RunWorkerAsync();
}

但我得到一个线程异常。有什么方法可以在窗口中显示变量值DoWorkBackgroundworker

4

2 回答 2

4

您应该在该DoWork部分中检索您需要的数据,然后将其分配给ea.Result,这将使其在该RunWorkerCompleted部分中可用。

在该RunWorkerCompleted部分中,您可以ea.Result再次访问,将对象转换回您在 中分配的任何类型DoWork,并根据需要将数据应用到您的 UI 控件。

worker.DoWork += (o, ea) =>
{
    ea.Result = GetMyData();
};

worker.RunWorkerCompleted += (o, ea) =>
{
    var myData = (myDataType)ea.Result;

    // Assign myData as needed to UI components...
};
于 2013-03-11T13:58:30.980 回答
1

您需要让Dispatcher安排您的代码在 UI 线程上执行并编组必要的参数。尝试这样的事情:

Dispatcher.Invoke(
    new Action<string>(() =>
    {
        // Access UI from here
    }),
    DispatcherPriority.Normal
);

虽然这(或类似的东西,因为这是记事本代码)可以解决您的问题,但您应该考虑在您的实现中使用 MVVM 模式。然后您将能够对 ViewModel 进行更改(仅更新数据)并且 UI 将相应更新。

于 2013-03-11T13:59:46.510 回答