同期的および非同期的に実行しようとしている 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 がフリーズし、要素を変更して「接続中」などを示すことができません。
どうすればこれを行うことができますか?