【问题标题】:How to deal with ThreadPool and member variables?ThreadPool和成员变量如何处理?
【发布时间】:2009-04-18 12:34:38
【问题描述】:

我对 .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());
            }
        }

【问题讨论】:

    标签: c# .net multithreading variables member


    【解决方案1】:
    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);
      }
    }
    

    【讨论】:

    • 不错的示例,但对 SaveData 的调用实际上应该是 SaveData(text) - 显然只是复制/粘贴的剩余部分;-)
    • 哇非常好的例子!使用 .NET 3.5,不再需要将对象作为参数的回调方法,这是否正确?我也非常感谢这个问题的 .NET 2.0 解决方案,所以我知道这两种方法。有什么想法吗?
    • 刚刚有了一个想法,在 .NET 2.0 世界中会采用这种方式吗? ThreadPool.QueueUserWorkItem(delegate { CallBack(customClass, "World"); });
    • @Kave:请参阅我的答案中链接的文章。不要使用 lambda 表达式,而是使用匿名方法。 @Stefan:为什么要使用“回调”方法呢?只需写:x => customClass.SaveData("Hello")
    • @Kave:是的,这就是您在 C# 2 中执行此操作的方式。请注意,即使您的目标是 .NET 2.0,您也可以在 C# 3 中使用 lambda 表达式。这是一种语言特性,而不是框架特性。
    【解决方案2】:

    最简单的方法是使用closure 来捕获您想要的所有变量(即使用匿名方法或 lambda 表达式)。如果您使用循环,则需要注意准确捕获的内容,但它比通过对象并将其强制转换回正确的类型等更方便。

    【讨论】:

    【解决方案3】:

    除了已经说过的:如果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

    【讨论】:

    • 这是一个非常好的提示。非常感谢。
    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多