는 그것을 할 수 있는가 :QueueUserWorkItem을 ref/out 상태로 사용하는 방법은 무엇입니까?
내에 ThreadProc는 통화가 시작된 때와는 다른 위치에 발신자의 데이터 포인트를 만들 수 있다는ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ref data);
같은?
가능하지 않은 경우 IntPtr 또는 이와 같은 기능을 구현할 수있는 방법이 있습니까?
는 그것을 할 수 있는가 :QueueUserWorkItem을 ref/out 상태로 사용하는 방법은 무엇입니까?
내에 ThreadProc는 통화가 시작된 때와는 다른 위치에 발신자의 데이터 포인트를 만들 수 있다는ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ref data);
같은?
가능하지 않은 경우 IntPtr 또는 이와 같은 기능을 구현할 수있는 방법이 있습니까?
아니요, 단순히 WaitCallback(object state)
의 정의에 비 -ref 매개 변수가 포함되어 있기 때문입니다.
그리고 가능한 경우 본질적으로 스레드 안전하지 않을 수 있습니다.
아니요, QueueUserWorkItem
은이 서명을 지원하지 않으며, 게다가 멀티 스레드 응용 프로그램에서 디버그 할 때 악몽이 될 수 있습니다.
아니요. 기능을 직접 구현하는 것은 바람직하지 않습니다. 스레드의 정의는 언제 data
값을 수정할 것인지 전혀 모른다는 것을 의미합니다. 참조로 스레드를 전달하면 일종의 경쟁 상태 또는 동시성 위반이 보장됩니다.
여기 당신은 전체 작업 예제를 이동 :
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..i. 내가 어딘가에이 코드를 발견하면 나는 밤에 잠을 잘 수있을 것 같지 않아 :) ..하지만 전체 예제 +1 –
매우 간단합니다. 클래스 개체를 상태 개체로 사용하십시오. 사실, 클래스 개체에 대한 참조는 스레드 생성에 의해 전달되므로 스레드 제작자와 생성 된 스레드 간의 상호 변수로 public 속성 클래스를 갖게됩니다.
.. 하하하, 내 대답에 똑같은 것을 추가했습니다 .. 매우 불편하므로 어떤 코드 예제도 게시하고 싶지 않았습니다. –