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

如何创建新线程来执行操作<t>

  •  8
  • sebagomez  · 技术社区  · 15 年前

    标题上写的差不多。我有一些方法需要在一个新的线程上运行,由于创建线程之前的所有代码几乎都是相同的,所以我想我应该创建一个函数,它可以作为我需要调用的操作的参数。

    问题是,我还没有找到如何告诉线程它需要执行该操作。这是可能的吗?下面是一个小的示例代码,说明我要做的事情。

    private void ExecuteInBiggerStackThread(Action<Helper> action, Parameters parms)
    {
        ParameterizedThreadStart operation = new ParameterizedThreadStart(action);// here's the mess
        Thread bigStackThread = new Thread(operation, 1024 * 1024);
    
        bigStackThread.Start(parms);
        bigStackThread.Join();
    }
    

    当做,
    塞巴

    4 回复  |  直到 13 年前
        1
  •  7
  •   Mark Seemann    15 年前

    像这样的事情应该会起作用:

    private void ExecuteInBiggerStackThread(Action<Helper> action, Helper h)
    {
        var operation = new ParameterizedThreadStart(obj => action((Helper)obj));
        Thread bigStackThread = new Thread(operation, 1024 * 1024);
    
        bigStackThread.Start(h);
        bigStackThread.Join();
    }
    
        2
  •  8
  •   Toby    15 年前

    我甚至不想麻烦 ParameterizedThreadStart . 让编译器完成脏的工作:

    private void ExecuteInBiggerStackThread(Action<Helper> action, Helper h)
    {
        Thread bigStackThread = new Thread(() => action(h), 1024 * 1024);
    
        bigStackThread.Start();
        bigStackThread.Join();
    }
    

    当然,您可以将此进一步,并将签名更改为:

    private void ExecuteInBiggerStackThread(Action action) { ... }
    
        3
  •  3
  •   StackTrace5000    13 年前

    或者更通用的方法版本….

    protected void ExecuteInBiggerStackThread<T>(Action<T> action, T parameterObject)
    {
      var bigStackThread = new Thread(() => action(parameterObject), 1024 * 1024);
      bigStackThread.Start();
      bigStackThread.Join();
    }
    
        4
  •  0
  •   ULysses    15 年前

    试用使用 Action<object> 然后投射到 Helper 在动作的身体里