C# 如何在ref/out状态下使用QueueUserWorkItem?
是否有可能做到:C# 如何在ref/out状态下使用QueueUserWorkItem?,c#,.net,multithreading,C#,.net,Multithreading,是否有可能做到: ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ref data); 这样我的ThreadProc就可以使调用方的数据指向与调用发起时不同的位置 如果不可能,有没有办法用IntPtr或其他什么实现这种功能?没有,仅仅因为WaitCallback(对象状态)的定义包含一个非ref参数 如果可以,它本身就是非线程安全的。否,QueueUserWorkItem不支持该签名,此外,在多线程应用程序中调试这将是一场噩
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ref data);
这样我的ThreadProc就可以使调用方的数据指向与调用发起时不同的位置
如果不可能,有没有办法用IntPtr或其他什么实现这种功能?没有,仅仅因为
WaitCallback(对象状态)
的定义包含一个非ref参数
如果可以,它本身就是非线程安全的。否,
QueueUserWorkItem
不支持该签名,此外,在多线程应用程序中调试这将是一场噩梦。否,并且不建议尝试自己实现该功能。线程的定义意味着您不知道它何时将修改数据的值。通过引用向线程传递任何内容实际上都会保证某种竞争条件或并发冲突。这里是完整的工作示例:
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++;
}
}
}
}
注:
从并发性的角度来看,您正在玩火。当这件事变得棘手时,你就开始冒着死锁和各种不愉快的风险 太简单了。
将类对象用作状态对象。
事实上,对类对象的引用将通过线程创建来传递,因此,类的公共属性将作为线程生成器和创建的线程之间的互变量。@sam..我不想发布任何代码示例,因为这非常危险。如果我在某处发现了这段代码,我想我晚上是睡不着的:)…但完整的例子是+1