作業中のプロジェクトでCross-thread operation not valid
エラーが発生しました。スレッドプロセスでイベントを処理する
Class MyObject
{
public delegate void MessageHandler(object sender, EventArgs e);
public event MessageHandler OnConnect;
public void Process()
{
await Connection();//Line highlighted when exception is raised.
}
private async Task Connection()
{
await 'blocking task here'
OnConnect(this, new EventArgs());
}
}
//Windows form
MyObject o = new MyObject();
o.OnConnect += o_OnConnect;
Thread connectionThread = new Thread(o.Process);
connectionThread.Start();
void o_OnConnect(object snder, EventArgs e)
{
listBox.items.add("Connection");
}
基本的な概要です。ここのスレッドプロセスは接続以外の作業を行い、他のビジネスも処理し、生き残る必要があることに注意してください。
すべてがうまくいきます。バックグラウンドで接続を開始し、リストボックスアイテムを追加しようとするとスレッドエラーが発生します。
誰でも私のためにこれについていくつかの光を当てることができますか?ハンドラはフォームスレッド上にあり、ここではこのボックスから項目を追加/削除できます。
私はスレッドピースを削除するには
o.Process();
にスレッド呼び出しラインをも変更しましたが、私は正確に同じエラーを取得します。
私が何か明白なものを見逃しているのか、私はここの雑草に脱出しているのか分かりません。私は実際にこのスレッドに非同期コードを実行させ、処理のために呼び出された場所にイベントを戻したいだけです。
[C#の別のスレッドからGUIを更新するには?](http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c) –
https://msdn.microsoft.com/en-us/library/zyzhdc6b(v=vs.110).aspx |あなたはGUIを更新するためにinvokeを使うことができました –
これは一例にすぎませんが、 'public void Process()'は本当に 'public Task Process()'でなければなりません。イベントハンドラを記述していない限り、 'async void'を実行すべきではありません。 –