从被调用的线程获取信息回到主线程?

时间:2011-07-22 19:08:14

标签: c# multithreading parameters

我在主线程中有一个“string”和一个“StreamReader”。我想将这些传递给一个将流读取器读入字符串的线程。我希望在主线程中更改该字符串。我的问题是我该怎么做?

其他信息:我有具体的原因,为什么我想要解决这个问题,所以请坚持规范。此外,我不能使用TPL,因为我无法获得框架4.0 ...再次出于特定原因。

3 个答案:

答案 0 :(得分:7)

所以你创建了一个stringStreamReader属性的类。您使用ParameterizedThreadStart将该类的实例传递给其他线程。您可以通过写入该类实例上的string属性来填充该毛茛。

线程完成后,您的班级实例上的string属性将被填满。耶。

类似

 class Foo {
     public string Bar { get; set; }
 }

然后:

 Foo foo = new Foo();
 var thread = new Thread(o => { Foo f = (Foo)o; f.Bar = "FillMeUpButterCup"; });
 thread.Start(foo);
 thread.Join();
 Console.WriteLine(foo);

哇!

我离开了StreamReader,但现在你明白了。

答案 1 :(得分:1)

创建线程时,您拥有ParameterizedThreadStart委托以及可以在那里传递的参数。只需创建一个具有两个属性的类 - stringStreamReader(可能还有其他任何你希望传递的属性)并将类的实例传递给线程启动方法。

public class ThreadStartParam
{
    public string Str { get; set; }
    public StreamReader StreamReader { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var t = new Thread(YourMethod);

        var param = new ThreadStartParam();
        param.Str = "abc";
        param.StreamReader = new StreamReader();

        t.Start(param);
    }

    static void YourMethod(object param)
    {
        var p = (ThreadStartParam) param;
        // whatever
    }
}

答案 2 :(得分:0)

我在去年的某个时候撰写了一篇关于此事的博客文章,我认为它将涵盖如何正确地与线程进行通信并从线程返回。基本上创建一个传递给线程的对象,你可以使用ParameterizedThreadStart传递给线程,你可以通过让一个委托调用来传回。

http://coreyogburn.com/post/Threads-Doing-Them-Right-wGUI.aspx

更具体地说,在您实现传递给线程的已更改String的主线程示例中,我建议在线程完成时,调用一个方法将字符串值传回并重新设置原始字符串的值。这将阻止线程在主线程尝试读取时添加到字符串中。