3

C#WPFプログラムに関する私の論文に取り組んでいますが、理解できないエラーが発生しました。

私のメインウィンドウコードのどこかで、次のような新しいスレッドを開始しています。

Thread searchServer = new Thread(new ThreadStart(doSearchServer));
            searchServer.SetApartmentState(ApartmentState.STA);
            searchServer.Start();

doSearchServerメソッドは次のことを行います。

    private void doSearchServer()
    {
        bool connected = ServerConnection.authentication();
        ServerConnection.getDeviceList();
        gotDataFromServer = connected;

        if (connected)
          ..
          ..
    }

ServerConnectionクラスは静的です。これは、他のWindowsでもそのクラスが必要なためです。

ServerConnection.authentication()で、クライアント(私のプログラム)は私のサーバーで認証を試みます。パスワードが必要な場合は、次のように新しいPasswordWindowを開きたいと思いました。

public static bool authentication()
    {
        UdpClient client = new UdpClient();
        IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, 55042);
        IPEndPoint ipRec = new IPEndPoint(IPAddress.Any, 0);

        byte[] bytes = Encoding.UTF8.GetBytes("authent|Username|Windows");
        client.Send(bytes, bytes.Length, ip);

        //Receive Answer
        byte[] recBuffer = client.Receive(ref ipRec);
        string recString = Encoding.UTF8.GetString(recBuffer);

        if (recString.Equals("authent|password"))
        {
            //Send Passwort
            Console.WriteLine("Password Required");

            Dispatcher.CurrentDispatcher.Invoke(new Action(() =>
            {
            PasswordWindow pw = new PasswordWindow();
            pw.ShowDialog();
            if (pw.ShowDialog() == true)
            {
                //send PW
            }
            else
            {
                //Dont send PW
            }
            }));

            client.Send(bytes, bytes.Length, ip);
            .
            .
            .
        }

PasswordWindowContructorでクラッシュします。STA +ディスパッチャー、MTA +ディスパッチャー、STAのみを試しました。試したものはすべて機能しませんでした...本当にわかりません。

スレッドがSTAスレッドである必要があるとまだ言われている理由を誰かに説明してもらえますか?

どんな助けにも感謝します!!

4

1 に答える 1

14

変化するDispatcher.CurrentDispatcher

System.Windows.Application.Current.Dispatcher

「UIスレッド」(最初にアプリケーションを開始したDispatcher.CurrentDispatcherスレッドに関連付けられているスレッド)ではないスレッドからプロパティにアクセスすると、新しいスレッドが作成されますが、これはここで必要なものではありません。DispatcherDispatcher

于 2013-01-31T15:35:39.020 に答える