私は基本的にクライアントからの接続を待つServerクラスを持っています。そのクラスの中で、クライアントからバイトを受け取れるようにするためにNetworkStreamオブジェクトを作成します。 NetworkStream.Read()メソッドは非同期ではないため(つまり、messageboxメソッドに似たコードを実行するためにクライアントからバイトを読み取るまで待機する)、別のスレッドでバイトを読み取る必要があります。プログラムを使用しているユーザは、プログラムがデータを読み込むのを待っている場合でも、プログラムと対話することができます。異なるスレッドからのアクセスオブジェクト
とにかく、多くのオブジェクトがそのスレッドによって所有されています。 1つの例は、そのクラスにlogというListがあるということです。私はそのリストを使ってサーバーの状態を知っています。たぶん接続を聞いているのかもしれません。あるいは、おそらくステータスが「接続済み」または「切断済み」でしょう。私のような何かを行う場合
ので:
public delegate void onUpdateHandler(string newStatus);
public event onUpdateHandler onUpdate = delegate { };
私はその後、火災:
私はログが更新されたときに知りたいのでServer myServer = new Server("192.168.0.120","1300"...\\ I pass the appropite parameters in order to instantiate it
//...
.. then I am able to latter look at the log as
string foo = myServer.Log[0] for example.
、サーバ・クラスに私はイベントを作成しましたサーバークラスのイベント:
onUpdate("waitingForConnection");
このイベントは、次の方法で受信します。
が、私はnewStatusで何かをしようとする場合、私は、エラーを知らせるを得る:
System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
はので、どのように私はイベントにオブジェクトを渡すことができますか?
編集
ので、私はまた私がしなければということに気づく:
私もエラーが出ます!
が、ときに私はのようにボタンから呼び出すことと同じことを実行します。
// SERVER IS RUNNING BEFORE CALLING THIS METHOD
private void button3_Click(object sender, RoutedEventArgs e)
{
listView1.Items.Add("my own string");
}
私はエラーを取得しないと!
なぜイベントにエラーが発生し、通常のボタンで呼び出すときにエラーが発生しないのですか。
を私の方法では、エラーが出てくる:ラムダ式がデリゲート型ではないので、 'System.Delegate'を型に変換することはできません。 –
@TonoNam:ああ、キャストするか、明示的にアクションを作成する必要があります。 –
@トーノ、ラムダは、いくつかのデリゲート型にキャストする必要があります、私の編集を参照してください。 – svick