1

我在将加载的数据从一个线程传递到另一个线程以将数据添加到表单时遇到问题。我在“var obj = new object[] { names }”中添加了另一个对象并得到“参数计数不匹配”。我仍然希望将第二个线程中的“LoadData()”中的“Clients”和“Messages”传递给第一个线程中的“UpdateFormMethod()”,但我不知道该怎么做。如果有人可以帮助我解决这个问题,我将不胜感激。

这是一个类中代码的重要部分:

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);

如果您需要返回类型,我可能会使用现有的Action<T>,Action<T1, T2>代表而不是创建新的代表 OR T Func<T1 [,T2]> 。

于 2012-04-28T08:15:18.150 回答
-1

你正在传递一个对象 [] 但你应该只传递对象。

发送它只需将其作为对象即

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

并将其转换回方法中。他们指定 object 作为参数类型的原因是它允许他们不必指定很多我认为的签名

于 2012-04-28T08:15:12.133 回答