1

ウィンドウをロードする必要があり、Window_Loadedいくつかの変数をロードしてウィンドウに表示する必要があります。

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();
}

しかし、スレッドの例外が発生しています。DoWorkからウィンドウに変数値を表示する方法はありますBackgroundworkerか?

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 に答える