0

編集:私が得たエラーは私の質問とは関係ありません。:/ -1

新しいスレッドでサービスを開始した後、エラーをキャッチしてメッセージ ボックスを表示したいと考えています。UIスレッドにないため、エラーが発生します。どうすればこの問題を回避できますか?

(WPFウィンドウ)

コード:

xmlServiceHost = XcelsiusServiceHost.CreateXmlServiceHost(Properties.Settings.Default.XmlDataService);

serviceThread = new Thread(_ => 
{
  try { xmlServiceHost.Open(); }
  catch (AddressAccessDeniedException)
  {
    CreateRegisterDashboardServiceFile();

    //Error not in UI thread.
    //this.ShowUserInfoMessage("The dashboard service needs to be registered. Please contact support.");
  }
});

serviceThread.Start();
4

2 に答える 2

3

(この回答はWPF用です。)

ええと、たとえば、ワーカー スレッドからメッセージ ボックスを開くことはできますが、その親を UI スレッドに属するものに設定することはできません (ワーカー スレッドは新しい子を追加して親ウィンドウを変更し、親ウィンドウはワーカー スレッドに属さず、通常は UI スレッドに属します)、基本的に親を null のままにしておく必要があります。

これにより、ユーザーがメッセージ ボックスを閉じずにアプリケーション ウィンドウを再度アクティブにすると、アプリケーション ウィンドウの背後に多数のメッセージ ボックスが表示されます。

適切な親ウィンドウを使用して UI スレッドにメッセージ ボックスを作成する必要があります。そのためには、UI スレッドのディスパッチャーが必要です。ディスパッチャーは UI スレッドでメッセージ ボックスを開き、適切な親を設定できます。

このような状況では、通常、スレッドを開始するときに UI ディスパッチャーをワーカー スレッドに渡し、次に小さなヘルパー クラスを使用します。これは、ワーカー スレッドで例外を処理するのに特に役立ちます。

 /// <summary>
/// a messagebox that can be opened from any thread and can still be a child of the 
/// main window or the dialog (or whatever) 
/// </summary>
public class ThreadIndependentMB
{
    private readonly Dispatcher uiDisp;
    private readonly Window ownerWindow;

    public ThreadIndependentMB(Dispatcher UIDispatcher, Window owner)
    {
        uiDisp = UIDispatcher;
        ownerWindow = owner;
    }

    public MessageBoxResult Show(string msg, string caption="",
        MessageBoxButton buttons=MessageBoxButton.OK,
        MessageBoxImage image=MessageBoxImage.Information)
    {
        MessageBoxResult resmb = new MessageBoxResult();
        if (ownerWindow != null)
        uiDisp.Invoke(new Action(() =>
        {
            resmb = MessageBox.Show(ownerWindow, msg, caption, buttons, image);

        }));
        else
            uiDisp.Invoke(new Action(() =>
            {
                resmb = MessageBox.Show( msg, caption, buttons, image);

            }));
        return resmb;
    }


}
于 2012-12-19T21:40:45.780 に答える
2

そのスレッドで通常のメッセージ ボックスを表示するだけで問題なく動作します。「this」キーワードと UI スレッドでのメソッドの呼び出しが問題です。

xmlServiceHost = XcelsiusServiceHost.CreateXmlServiceHost("http://localhost:123/naanaa");//Properties.Settings.Default.XmlDataService);

serviceThread = new Thread(_ =>
{
  try { xmlServiceHost.Open(); }
  catch (AddressAccessDeniedException)
  {
    CreateRegisterDashboardServiceFile();
    System.Windows.MessageBox.Show("The dashboard service needs to be registered. Please contact support.");
  }
});

serviceThread.Start();
于 2012-10-18T07:54:52.537 に答える