我在主线程中有一个“字符串”和一个“StreamReader”。我想将这些传递给一个将读取streamreader到字符串中的线程。我想要在主线程中更改字符串。我的问题是我该如何做到这一点?从被调用线程获取信息回主线程?
附加信息:我有特定的原因,为什么我想要线程,所以请只坚持规格。另外,我不能使用TPL,因为我无法获得框架4.0 ...再次出于具体原因。
我在主线程中有一个“字符串”和一个“StreamReader”。我想将这些传递给一个将读取streamreader到字符串中的线程。我想要在主线程中更改字符串。我的问题是我该如何做到这一点?从被调用线程获取信息回主线程?
附加信息:我有特定的原因,为什么我想要线程,所以请只坚持规格。另外,我不能使用TPL,因为我无法获得框架4.0 ...再次出于具体原因。
因此,您使用string
和StreamReader
属性进行授课。您使用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
委托和一个可以传递给它的参数。只需创建一个具有两个属性的类 - string
和StreamReader
(可能还有其他任何您想要传递的属性),并将该类的实例传递给线程启动方法。
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
在你的主线程中实现改变的字符串,你传递给线程的例子更具体,我建议上线后,您调用将字符串值恢复的方法和重新设置原始字符串的值。这将阻止线程添加到字符串,而主线程可能会尝试读取它。