C#从线程(其他类)访问表单对象?需要多线程对象数组?

时间:2015-06-09 13:00:26

标签: c# multithreading object delegates

  

[OT-简介]

     

我实际上是C编码器,今天刚刚开始使用C#,原因就是存在一个库,这真的简化了我的   生活。对不起,我的知识非常薄弱,我不得不承认我对完成这个工具比对学习新编程语言感兴趣更感兴趣。我希望你仍然会帮助我解决这个问题,并向我解释我的第二个问题。谢谢!

     

[/ OT-简介]

但是,我需要访问/更新表单对象=>我的多线程应用程序中线程(安全)的RichTextBox(.AppendText)

更具体地说,我想以编程方式执行以下操作:

component.OnEvent += delegate(object o) 
{ 
    lock (lockObj) 
    { 
        FormMain.RichTextBox.AppendText("SomeRandomText")
    }; 
};

如果我理解了一切正确,lock(lockObj)会阻止访问RichTextBox,所以这应该安全更新

但是,我不知道如何访问RichTextBox(欣赏最简单的,如果不是太慢)的方式。

第二个问题 - 需要多线程对象数组吗?

目前我只是创建了一个这样的对象:

ThreadClass threadclassobj = new ThreadClass (); 

以这种方式称呼它(不是这样的):

for (;;)
{
    threadclassobj.StartTheThread(username, password);     
}

StartTheThread看起来像这样:

public Thread StartTheThread(string param1, string param2)
{
    var t = new Thread(() => Check(param1, param2));
    t.Start();
    return t;
}

我使用Lamda表达式方法传递参数..

我只是好奇如何处理它,我想知道一个对象如何同时创建多个Thread并以正确的方式处理参数。

通常(在C中)我会创建一个ThreadClass数组。

提前致谢!

问候。

1 个答案:

答案 0 :(得分:0)

要访问/写入winforms对象,您不需要锁定,需要调用:

FormMain.Invoke((Action) delegate {
    FormMain.RichTextBox.AppendText("SomeRandomText")
});

这是线程安全的。

对于您的第二个问题,您将丢弃对该主题的引用,因此您无法将结果发送给他们。如果您需要获得结果,那么是的,您需要List<Thread>来存储它们。

如果您使用的是最新的.Net(4.0及更高版本),您可能需要查看任务并行库。它极大地简化了C#的多线程:

var task = Task.Run(() => {
    //Multithreaded stuff here
    return obj;
});
// Sometime later...
var result = task.result;