从被调用线程获取信息返回主线程

本文关键字:线程 返回 信息 获取 调用 | 更新日期: 2023-09-27 18:03:28

我在主线程中有一个"string"和一个"StreamReader"。我想把这些传递给一个线程,它将读取流阅读器到字符串中。我希望这个字符串在主线程中被改变。我的问题是我该怎么做?

附加信息:我有具体的原因,为什么我想线程这个,所以请坚持规格。此外,我不能使用TPL,因为我无法获得框架4.0…还是有特殊原因

从被调用线程获取信息返回主线程

所以你创建了一个具有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,但现在你明白了。

当创建线程时,你有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
    }
}

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

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

更具体地说,在主线程实现传递给线程的更改字符串的示例中,我建议在线程完成时,调用一个方法将字符串值传递回来并重新设置原始字符串的值。这将防止线程在主线程可能试图读取字符串时向字符串添加内容。