代码之家  ›  专栏  ›  技术社区  ›  Amicable

从线程返回值

  •  0
  • Amicable  · 技术社区  · 11 年前

    如果我创建了一个委托,允许将多个参数传递到线程启动方法中,如中所述 this answer ,从 RealStart 方法到启动线程的方法?

    在我看来,我的选择要么是创建一个静态变量。

    private static Boolean result;
    private static String message = "";
    
    public Thread StartTheThread(SomeType param1, SomeOtherType param2) {
      var t = new Thread(() => RealStart(param1, param2));
      t.Start();
      return t;
    }
    
    private static void RealStart(SomeType param1, SomeOtherType param2) {
      ...
    }
    

    或将委托包装在类中

    private class TestThread
    {
        public String message = "";
        public Boolean result;
    
        public Thread StartTheThread(SomeType param1, SomeOtherType param2) {
          var t = new Thread(() => RealStart(param1, param2));
          t.Start();
          return t;
        }
    
        private static void RealStart(SomeType param1, SomeOtherType param2) {
          ...
        }
    }
    

    我在使用类时看到的一个问题是,它在某种程度上否定了通过委托传递参数的意义,因为我可以在初始化类时将它们传递到类中。

    (或者不以这种方式使用它的第三种选择) 能够 重新启动 有没有退货类型?

    使用所描述的任何一个过程,即使只是归结为代码的结构/组织,是否有任何利弊?

    2 回复  |  直到 7 年前
        1
  •  2
  •   David rakar    11 年前

    使用任务和任务。结果:

        // Return a value type with a lambda expression
        Task<int> task1 = Task<int>.Factory.StartNew(() => 1);
        int i = task1.Result;
    
        // Return a named reference type with a multi-line statement lambda.
        Task<Test> task2 = Task<Test>.Factory.StartNew(() =>
        {
            string s = ".NET";
            double d = 4.0;
            return new Test { Name = s, Number = d };
        });
        Test test = task2.Result;
    
        2
  •  1
  •   cezarlamann    11 年前

    您也可以使用操作(用于更新表单组件…):

    public TextBox foo = new TextBox();
    foo.Text = "foo";
    .
    .
    .
    Thread t = new Thread(() => FooBar(p1, p2) );
    t.Start();
    
    public void FooBar(Parm parm1, Parm parm2)
    {
        ...
        this.foo.BeginInvoke(new Action(() => foo.Text = "bar"));
    }