2012-04-28 4 views
1

あるスレッドから別のスレッドにロードされたデータを渡してフォームにデータを追加する際に問題があります。私は別のオブジェクトを "var obj = new object [] {names}"に追加し、 "Parameter count mismatch"を取得しました。私はまだ最初の1つの "UpdateFormMethod()"に2番目のスレッドの "LoadData()"から "Clients"と "Messages"を渡すことを好むでしょうが、私はそれをどうするか考えていません。誰かが私にこの問題を手伝ってもらえれば幸いです。ここで複数のオブジェクトをスレッド間で送信するにはC言語のinvokeを使用します。#

1つのクラス内のコードの重要な部分です:

private readonly Thread _thread; 
    public readonly Loader Loader = new Loader(); 
    public Dictionary<string, Client> Clients; 
    public Dictionary<string, Message> Messages; 
    private bool _stopData = false; 
    public delegate void UpdateForm(object data); 
    public UpdateForm MyDelegate; 

    public Fcon() { 
     InitializeComponent(); 
     MyDelegate = new UpdateForm(UpdateFormMethod); 
     _thread = new Thread(LoadData); 
     _thread.Start(); 
    } 

    public void UpdateFormMethod(object data) { 
     foreach (var str in ((IEnumerable<string>)data).Where(str => !fcon_container_users_list.Items.Contains(str))) { 
      fcon_container_users_list.Items.Insert(0, str); 
     } 
    } 

    public void LoadData() { 
     while (!_stopData) { 
      Clients = Loader.GetClients(Operator); 
      Messages = Loader.GetMessages(Operator); 
      var status = Loader.SetStatus(Operator); 
      var names = new string[Clients.Count]; 
      var x = 0; 
      foreach (var kvp in Clients) { 
       names[x] = "user_" + kvp.Value.id_fcon_client; 
       x++; 
      } 
      var obj = new object[] { names }; 
      this.Invoke(this.MyDelegate, obj);  
      Thread.Sleep(1000); 
     } 
    } 

    public void StopData() { 
     _stopData = true; 
    } 
+0

あなたの質問についてもっと明示してください。 (1) "他のオブジェクトを追加する"ためにあなたは正確に何をしましたか? (2)「私はまだ好きです...」とは、「私の質問はどうすればいいですか」という意味ですか、それとも実際の質問ですか? –

答えて

1

署名がどこから来ているのかははっきりしないようです。それはあなた自身のデリゲートです - あなたが署名を変更したい場合は、それを実装するデリゲートの署名と方法を変更します。次に

public delegate void UpdateForm(IEnumerable<string> data, int foo); 

... 

public void UpdateFormMethod(IEnumerable<string> data, int foo) { 
    foreach (var str in data.Where(str => 
       !fcon_container_users_list.Items.Contains(str))) { 
     fcon_container_users_list.Items.Insert(0, str); 
    } 
} 

:単に

var obj = new object[] { names, someIntVariable }; 
this.Invoke(this.MyDelegate, obj); 

以上:

this.Invoke(this.MyDelegate, names, someIntVariable); 

私はおそらく、既存のAction<T>Action<T1, T2>代理人を使用しますが、新しいものを作成するのではなく、OR T Func < T1 [、T2]戻り値の型が必要な場合はを参照してください。

+0

ありがとうございました!これは完全に機能します。そして、アクションに関するアドバイスをありがとう、私はそれについて読むつもりです。 C#の最初の1週間です。私は早く勉強する必要があります。 – Phillyfisher

-1

あなたは[]内のオブジェクトを渡しているが、あなただけのオブジェクトを渡す必要があります。単にオブジェクトとしてつまり

this.Invoke(this.MyDelegate, (object)obj); 

それをキャストし、メソッド内にそれをバックキャストでそれを送信するために

。彼らがパラメータ型としてオブジェクトを指定したのは、私が思う多くのシグネチャを多く指定する必要がないからです。

+0

なぜ、デリゲート型を変更するだけの方がずっと簡単なのですが、このために配列を作成して、すべてのビットをメソッドにキャストしたいのですか? –

+0

Point taken @JonSkeet - 私はシステム定義のデリゲートだと思った。デリゲートの署名が与えられても、私の答えはまだ立っています:)途中で素晴らしいスコア:)私は 'Skeet'と議論することはできません! –

関連する問題