2010-11-22 6 views
4

私は主スレッドプロセスにオブジェクトを渡そうとしていましたが、思った通りに動作しないようです。スレッドをオブジェクトに渡すのが失敗する - C#

まず、私はスレッドを作成します。

Thread thrUDP; 

は、それから私は私が必要とするデータを格納するために使用するオブジェクトを作成します。

UDPData udpData; 

は今、私はセットアップし、正しいデータwiththeオブジェクトを初期化します新しいスレッドを開き、Start()メソッドに渡されたオブジェクトで開始します。

udpData = new UDPData("224.5.6.7", "5000", "0", "2"); 

      thrUDP = new Thread(new ParameterizedThreadStart(SendStatus)); 
      thrUDP.Start(udpData); 

これはthです

private void SendStatus(UDPData data) 
{ 
} 

私はしばらく前にスレッドを使用して覚えていると私はこの間違った方法をやっているか、私はちょうど行方不明です私は、彼らがにデータを渡すことがそれほど難しいことではありませんでした確信している:私は開始したい電子方法コードの一部?

ありがとうございます!

答えて

3

ParameterizedThreadStartデリゲートは次のように宣言されています。明らかに、このデリゲートは、あなたのメソッドのシグネチャと互換性がない、とSystem.Threading.Threadは任意delegate-で動作するように取得するための直接的な方法はありません

public delegate void ParameterizedThreadStart(object obj); 

タイプ。

あなたのオプションの1つは方法のための互換性の署名を使用することで、そして、適切なキャストです:

private void SendStatus(object obj) 
{ 
    UDPData data = (UDPData)obj; 
    ... 
} 

他のオプションはクロージャを作成し、C#コンパイラに問題をパントすることです。たとえば、

new Thread(() => SendStatus(udpData)).Start(); 

ThreadStart代理人を代わりに使用することに注意してください。さらに、後でudpDataローカルがキャプチャされているため、それを変更することに注意してください。

また、独自のスレッドを生成する代わりにスレッドプールを使用しても構わない場合は、非同期の代理人を使用できます。たとえば、次のように

Action<UDPData> action = SendStatus; 
action.BeginInvoke(udpData, action.EndInvoke, null); 
+0

ああ、私は単純にパラメータの種類を変更して方法で、正しい型にキャストするために必要な!ありがとう=] –

+1

@Jamie Keeling:はい、そうです。 – Ani

+0

私は同意しません - 通常、クラスは内部で新しいスレッドを作成する必要があります - 外部からのスレッドの作成は、同期化が複雑になる場合、私のpovからのdesasterのレシピです。 – weismat

1
private void SendStatus(object data) 
{ 
UDPData myData = (UDPData) data; 
} 
関連する問題