2010-01-07 1 views

답변

1

아니요, 단순히 WaitCallback(object state)의 정의에 비 -ref 매개 변수가 포함되어 있기 때문입니다.

그리고 가능한 경우 본질적으로 스레드 안전하지 않을 수 있습니다.

+0

.. 하하하, 내 대답에 똑같은 것을 추가했습니다 .. 매우 불편하므로 어떤 코드 예제도 게시하고 싶지 않았습니다. –

1

아니요, QueueUserWorkItem은이 서명을 지원하지 않으며, 게다가 멀티 스레드 응용 프로그램에서 디버그 할 때 악몽이 될 수 있습니다.

1

아니요. 기능을 직접 구현하는 것은 바람직하지 않습니다. 스레드의 정의는 언제 data 값을 수정할 것인지 전혀 모른다는 것을 의미합니다. 참조로 스레드를 전달하면 일종의 경쟁 상태 또는 동시성 위반이 보장됩니다.

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++; 
      } 
     } 
    } 
} 

참고 : 동시성의 관점에서

, 당신은 화재 큰 시간 함께 놀고있다. 이것이 까다로워지면 교착 상태와 모든 종류의 불쾌감을 느끼게됩니다.

+0

@ sam..i. 내가 어딘가에이 코드를 발견하면 나는 밤에 잠을 잘 수있을 것 같지 않아 :) ..하지만 전체 예제 +1 –

0

매우 간단합니다. 클래스 개체를 상태 개체로 사용하십시오. 사실, 클래스 개체에 대한 참조는 스레드 생성에 의해 전달되므로 스레드 제작자와 생성 된 스레드 간의 상호 변수로 public 속성 클래스를 갖게됩니다.

관련 문제