1

読み込まれたデータをあるスレッドから別のスレッドに渡してデータをフォームに追加する際に問題があります。「var obj = new object[] { names }」に別のオブジェクトを追加すると、「パラメーター数の不一致」が発生しました。2 番目のスレッドの「LoadData()」から「Clients」と「Messages」を最初のスレッドの「UpdateFormMethod()」に渡したいと思いますが、その方法がわかりません。誰かがこの問題で私を助けることができれば、私は感謝します.

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;
    }
4

2 に答える 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);

リターンタイプが必要な場合は、OR T Func <T1 [、T2]>を使用して、新しいデリゲートを作成するのではなく、既存Action<T>のデリゲートを使用する可能性があります。Action<T1, T2>

于 2012-04-28T08:15:18.150 に答える
-1

オブジェクト[]を渡しますが、オブジェクトのみを渡す必要があります。

送信するには、オブジェクトとしてキャストするだけです。

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

メソッド内にキャストし直します。パラメータタイプとしてオブジェクトを指定した理由は、多くのシグネチャを指定する必要がないためだと思います

于 2012-04-28T08:15:12.133 に答える