-1

同期的および非同期的に実行しようとしている TCP 接続の前後に、いくつかの GUI 要素を変更しようとしています。

public async void ConnectAsync(String h, String p, String n)
{
    if (connected)
        return;

    try
    {
        hostname = new HostName(h);
        port = p;
        nickname = n;

        await sock.ConnectAsync(hostname, port);

        connected = true;
        if (Connected != null)
            Connected(this, EventArgs.Empty);
    }
    catch (Exception e)
    {
        sock.Dispose();
        hostname = null;
        port = null;
        nickname = null;

        if (ConnectionFailed != null)
            ConnectionFailed(this, EventArgs.Empty);
    }
}

上記のこのメソッドは、GUI クラス (以下のコード) によって呼び出されます。

private void ConnectButtonClicked(object sender, RoutedEventArgs e)
{
    string nickname;

    if (Bar.Visibility == Windows.UI.Xaml.Visibility.Visible)
        Bar.Visibility = Windows.UI.Xaml.Visibility.Collapsed;

    if (Status.Visibility == Windows.UI.Xaml.Visibility.Collapsed)
        Status.Visibility = Windows.UI.Xaml.Visibility.Visible;

    qc.ConnectionFailed += new ConnectionFailedEventHandler(ConnectionFailedEventHandler);
    qc.Connected += new ConnectedEventHandler(ConnectedEventHandler);

    nickname = Nickname.Text;

    /* HERE */
    Task.Run(() => qc.ConnectAsync("irc.quakenet.org", "6667", nickname));

    updateStatus("Connecting...");
    ConnectButton.IsEnabled = false;
    Nickname.IsEnabled = false;
    ProgLanguages.IsEnabled = false;
}

メソッドが 2 つの異なるイベントを発生させることを確認してください。

Task.Run(..) を使用してこのコードのようにこのメソッドを呼び出すと、これらのイベントが発生し、それらが処理されると、コードはこのスレッドによって GUI を変更しようとし、例外がスローされます。

Task.Run(..) なしでメソッドを呼び出すと、GUI がフリーズし、要素を変更して「接続中」などを示すことができません。

どうすればこれを行うことができますか?

4

2 に答える 2

2

まず回避async voidするのでConnectAsyncreturnに変更Task

次に、イベント ハンドラーで実行でき、await qc.ConnectAsync(...)まったく必要ありませんTask.Run

于 2013-05-06T22:56:26.743 に答える