Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从被调用线程将信息返回到主线程?_C#_Multithreading_Parameters - Fatal编程技术网

C# 从被调用线程将信息返回到主线程?

C# 从被调用线程将信息返回到主线程?,c#,multithreading,parameters,C#,Multithreading,Parameters,我在主线程中有一个“字符串”和一个“StreamReader”。我想将这些传递给一个线程,该线程将streamreader读入字符串。我希望在主线程中更改该字符串。我的问题是我如何做到这一点 附加信息:我有具体的原因,为什么我想线程,所以请坚持的规格。另外,我不能使用TPL,因为我无法获得Framework4.0。。。同样是出于特定的原因。因此,您可以使用字符串和StreamReader属性创建一个类。您可以使用ParameterizedThreadStart将该类的实例传递给其他线程。通过写入

我在主线程中有一个“字符串”和一个“StreamReader”。我想将这些传递给一个线程,该线程将streamreader读入字符串。我希望在主线程中更改该字符串。我的问题是我如何做到这一点


附加信息:我有具体的原因,为什么我想线程,所以请坚持的规格。另外,我不能使用TPL,因为我无法获得Framework4.0。。。同样是出于特定的原因。

因此,您可以使用
字符串和
StreamReader
属性创建一个类。您可以使用
ParameterizedThreadStart
将该类的实例传递给其他线程。通过写入类实例上的
string
属性,可以让另一个线程填充毛茛

线程完成后,将填充类实例上的
字符串
属性。耶

大概是

 class Foo {
     public string Bar { get; set; }
 }
然后:


我省略了
StreamReader
,但现在您明白了重点。

在创建线程时,您有
parameteredThreadStart
委托和一个可以传递到那里的参数。只需创建一个具有两个属性的类——
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传递给线程,也可以通过调用委托来传递回线程

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

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
    }
}