如何将QueueUserWorkItem与ref / out状态一起使用?

时间:2010-01-07 20:59:30

标签: c# .net multithreading

是否可以这样做:

ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ref data);

这样我的ThreadProc可以使调用者的数据指向与调用发起时不同的位置?

如果不可能,有没有办法用IntPtr或其他东西实现这样的功能?

5 个答案:

答案 0 :(得分:2)

在这里,完整的工作样本:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication19 {
    class Program {

        static object sync = new object(); 

        static void Main(string[] args) {
            int counter = 0; 
            ThreadPool.QueueUserWorkItem(new WaitCallback((_) => ThreadProc(ref counter)), null);

            while (true) {
                lock (sync) {
                    if (counter == 1) break;
                }    
                Thread.Sleep(1); 
            }

            Console.Write(counter);
            Console.Read();

        }

        static void ThreadProc(ref int counter) {
            lock (sync) {
                counter++;
            }
        }
    }
}

注意:

从并发的角度来看,你正在玩大火。当这变得棘手时,你开始冒着死锁和各种恶意的风险。

答案 1 :(得分:1)

不,仅仅是因为WaitCallback(object state)的定义包含非ref参数。

如果可以的话,它本身就是非线程安全的。

答案 2 :(得分:1)

不,QueueUserWorkItem不支持该签名,除此之外,在多线程应用程序中进行调试将是一场噩梦。

答案 3 :(得分:1)

不,尝试自己实现功能是不可取的。线程的定义意味着您不知道何时修改data的值。通过引用线程传递任何内容实际上可以保证某种竞争条件或并发冲突。

答案 4 :(得分:0)

它如此简单。 使用类对象作为状态对象。 实际上,对类对象的引用将通过线程创建传递,因此您将使用类公共属性作为线程制定者和创建的线程之间的相互变量。