【问题标题】:C# 4.0 how to pass variables to threads?C# 4.0 如何将变量传递给线程?
【发布时间】:2010-04-15 22:16:32
【问题描述】:

如何将一些参数传递给运行另一个类的函数的新线程? 我要做的是将一个数组或多个变量传递给另一个类中的函数,并由新线程调用。

我尝试过这样做>

    Functions functions = new Functions();

    string[] data;

    Thread th = new Thread(new ParameterizedThreadStart(functions.Post()));

    th.Start(data);

但它显示错误“方法'Post'没有重载需要0个参数”

有什么想法吗?

【问题讨论】:

  • 请注意,您的代码的真正问题是您正在调用 Post 方法,而不是将其传递给委托构造函数。您应该在 functions.Post() 之后省略括号,这将编译。

标签: .net multithreading c#-4.0


【解决方案1】:

既然你有这个标记的 C# 4,那么新的方法是:

Functions functions = new Functions();

string[] data = GetData();

Task.Factory.StartNew( () => functions.Post(data) );

如果您真的想使用专用线程而不是任务并行库来保留它,您可以。鉴于您的 cmets,听起来 Post() 可能定义为 Post(string[] data)。这将不起作用,因为 ParameterizedThreadStart 期望方法是 Post(object data)

但是,您可以通过 lambdas 并使用 ThreadStart 而不是 ParameterizedThreadStart 来解决此问题,而无需更改您的方法:

Functions functions = new Functions();
string[] data = GetData();
Thread th = new Thread( () =>
    {
        functions.Post(data);
    });
th.Start();

【讨论】:

    【解决方案2】:

    直接的答案是:

     new Thread(new ParameterizedThreadStart(functions.Post/*(remove)*/));
    

    和 Functions.Post 的格式应该是:

     void Post(object state) { string[] data = (string[]) state; .... }
    

    如果您已经有一个固定的void Post(string[] data),您可以在 Functions 类中添加一个包装器:

     void Post2(object state) { Post((string[]) state); }
    

    但是在使用 Fx4 时,您应该真正了解一下任务库。

    【讨论】:

    • 现在我得到“'Post' 没有重载匹配委托 'System.Threading.ParameterizedThreadStart'”
    • @Aviatrix:你能发布你的functions.Post()的代码(或者至少是签名)吗?
    • @Aviatrix,我还在编辑一点,也许最后一个版本有帮助。但我和里德在这里,请张贴大纲。
    • 问题很可能是“Post”不接受对象,而是字符串[],因为它是参数......
    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2016-07-23
    • 2019-12-26
    • 1970-01-01
    • 2015-12-21
    • 2020-09-22
    相关资源
    最近更新 更多