【问题标题】:Using threadpool and func objects使用线程池和函数对象
【发布时间】:2008-12-27 20:03:27
【问题描述】:

当使用线程池及其 queuecallbackitem 时,我可以不传入一个 func 对象(从方法参数中)吗?

我没有看到一个接受一个参数但什么都不返回的函数。有func<T, TResult>,但是如何将TResult设置为null(要表示“此方法返回void”)?

另外,我如何将线程池用于返回并获取各种参数的方法?我可以不将 Func 对象存储在通用集合中,还存储一个 int 来指示优先级,然后执行这些 funcs 吗?

最后,在一个静态对象(例如集合)中,它需要在全局应用程序中进行什么同步?

【问题讨论】:

    标签: c#


    【解决方案1】:

    唯一类似于WaitCallbackFunc<...>/Action<...> 委托是Action<object>。它不能直接使用;但是,您可以将委托包装在彼此内部:

            Action<object> func = // TODO
            ThreadPool.QueueUserWorkItem(state=>func(state));   
    

    要返回结果,一种选择是更新外部状态。 Lambdas / anon-methods 对此很有用,因为它们提供闭包支持:

            Func<int, int> func = x => x * 5;
            int query = 4, result = 0;
            ThreadPool.QueueUserWorkItem(state=> {
                result = func(query);
            });
    

    执行后,result(来自上述上下文)将被更新。但是,回调更常见:

            Func<int, int> func = x => x * 5;
            int query = 4;
            Action<int> callback = x =>
            {
                Console.WriteLine(x);
            };
            ThreadPool.QueueUserWorkItem(state=> {
                int result = func(query);
                callback(result);
            });
    

    回调函数对结果做了一些有用的事情。

    希望这也显示了您如何在线程池线程中执行任意函数。

    重新同步;您在辅助线程上,因此如果与任何共享状态交谈,您肯定需要同步。但是,您可以选择使用 UI 来同步 结果(如果合适) - 即(来自 winform):

    ThreadPool.QueueUserWorkItem(state => {
        // now on worker thread
        int result = ... // TODO
    
        this.Invoke((Action)delegate {
           // now on UI thread
           this.Text = result.ToString();
        });
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-18
      • 2011-02-19
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 2013-08-07
      相关资源
      最近更新 更多