如何处理ThreadPool和成员变量?

时间:2009-04-18 12:34:39

标签: c# .net multithreading variables member

我对.NET中的ThreadPool有点新意。我想知道,如果我只能将一个对象发送到我的回调方法,我怎样才能访问类成员变量来调用它的方法? (参见CallBack()中的customClass)

我如何从customClass加载数据?我是否将customClass传递给另一个CallBack方法?这种做法好吗?

正如您所看到的那样,它有点缺乏经验,所以在此过程中的任何提示都会受到赞赏。

谢谢你, 卡瓦

class Program
           {
                static void Main(string[] args)
                {
                    CustomClass customClass = new CustomClass();

                ThreadPool.QueueUserWorkItem(CallBack, "Hello"); 


                Console.Read();
            }

            private static void CallBack(object state)
            {
                customClass.SaveData(state.ToString());
            }
        }

3 个答案:

答案 0 :(得分:2)

class Program
{
  static void Main(string[] args)
  {
    CustomClass customClass = new CustomClass();
    ThreadPool.QueueUserWorkItem(x => CallBack(customClass, "Hello")); 
    Console.Read();
  }

  private static void CallBack(CustomClass custom, string text)
  {
    customClass.SaveData(text);
  }
}

答案 1 :(得分:1)

最简单的方法是使用closure捕获所需的所有变量(即使用匿名方法或lambda表达式)。如果你正在使用循环,你需要小心确切地捕获了什么,但它比通过一个对象并且必须将它强制转换为正确的类型等更容易。

答案 2 :(得分:1)

除了上述内容之外:如果CustomClass在您的控制之下并且异步调用SaveData是一个常见用例,您可以考虑提供SaveDataAsync方法:

class CustomClass {

    public void SaveDataAsync(string path) {
        ThreadPool.QueueUserWorkItem(state => this.SaveData(path));
    }

    public void SaveData(string path) {
        ...
    }
}

请参阅the Event-based Asynchronous Pattern