2010-02-09 2 views
0

예를 들어, BackgroundWorker에 인 스레드는 같은 캐스팅 될 수 있습니다 내 배경 작업자 스레드. 나는 [발신자]를 BackGround Worker로 던졌습니다. 왜냐하면 나는 그가 무엇인지 알고 있기 때문입니다.

내가 만약에 내가 캐스팅해야하는지 찾을 수가 없습니다

: 사용, 대신 나는 Process 클래스를 사용하고, 실행 한 경우 어떤 배경 노동자의 DOS 배치 파일을 말한다 :

enter code here 

프로세스 proc = 새 프로세스(); proc.FileName = "some_dos_batch_file.bat"; proc.Exited = ProcessExited; proc.Start();

죄송합니다.이 프로세스가 완료되면 완료는 아래 'ProcessExited'에서 처리됩니다. 하지만 그 경우에는 보낸 사람 주장을 무엇에 던져 넣어야합니까? 분명히 배경 작업자가 아니지만 무엇이 확실하지 않습니까? .Results 속성을 Background 작업자와 동일하게 사용하고 싶습니다.

감사합니다. 혼란스럽게 생각합니다.

+0

수 없습니다 "좋아, 나는 ... 다시 작성자에게, 수행하고있다" '시작하라는 말을 듣고 이제는 끝났다고 말하는'과정과 관련하여 이해가 안되기 때문에 좀 더 명확하게 설명해야합니다. 제발 우리가 당신을 도울 수있는 SO'ers에 ​​대한 심령 디버거/mindreaders 아니에요 코드를 포함하지 마십시오 .... – t0mm13b

+0

나는 더 많은 정보를 추가했습니다. 감사. 너는 읽을 마음이 없다면 네가 나에게 제한된 사용을하고 있다는 것을 알 수있다! 농담이야. 도움에 감사드립니다. – Joe

답변

1

은 내가하지 않으면, 분명히하시기 바랍니다 질문을 이해 바랍니다. 스레딩에 대해 이야기하고 있고 System.Diagnostics.Process을 사용하고 있다면 스레드 이벤트를 사용해야합니다 ... TestARP이라는 간단한 클래스 아래에서 숨겨진 창을 사용하여 명령 줄에 액티브의 MAC/IP 주소를 검색하는 것을 고려하십시오 스레드 만이 프로세스의 이벤트가 여전히 잡힐 것 스레드에서이 작업을 실행한다면

public class TestARP 
{ 
    private StringBuilder sbRedirectedOutput = new StringBuilder(); 
    public string OutputData 
    { 
     get { return this.sbRedirectedOutput.ToString(); } 
    } 
    public void Run() 
    { 
     System.Diagnostics.ProcessStartInfo ps = new System.Diagnostics.ProcessStartInfo(); 
     ps.FileName = "arp"; 
     ps.ErrorDialog = false; 
     ps.Arguments = "-a"; 
     ps.CreateNoWindow = true; 
     ps.UseShellExecute = false; 
     ps.RedirectStandardOutput = true; 
     ps.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 

     using (System.Diagnostics.Process proc = new System.Diagnostics.Process()) 
     { 
      proc.StartInfo = ps; 
      proc.Exited += new EventHandler(proc_Exited); 
      proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(proc_OutputDataReceived); 
      proc.Start(); 
      proc.WaitForExit(); 
      proc.BeginOutputReadLine(); 
      while (!proc.HasExited) ; 
     } 
    } 

    void proc_Exited(object sender, EventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("proc_Exited: Process Ended"); 
    } 

    void proc_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e) 
    { 
     if (e.Data != null) this.sbRedirectedOutput.Append(e.Data + Environment.NewLine); 
     //System.Diagnostics.Debug.WriteLine("proc_OutputDataReceived: Data: " + e.Data); 
    } 
} 

(: StringBuilder 내 인스턴스에 추가됩니다 스트림에 재 명령의 출력과 관련하여, 그 자체가). 그러나 스레드가 끝날 때까지 기다리는 것에 대해 이야기하고 있다면, 위의 클래스를 실행하는 ThreadTestARP이라는이 클래스 코드를 살펴보십시오. NA 스레드 ...으로 ManualResetEvent _mre 스레드의 컨텍스트에서 말을 알리기 위해 사용되는 방법

public class ThreadTestARP 
{ 
    private TestARP _testARP = new TestARP(); 
    private ManualResetEvent _mre = new ManualResetEvent(false); 
    public ThreadTestARP() 
    { 
    } 
    public TestARP ARPTest 
    { 
     get { return this._testARP; } 
    } 
    public void Run() 
    { 
     Thread t = new Thread(new ThreadStart(RunThread)); 
     t.Start(); 
     this._mre.WaitOne(); 
     // Blocks here... 
     t.Join(); 
    } 
    private void RunThread() 
    { 
     this._testARP.Run(); 
     this._mre.Set(); 
    } 
} 

참고에게

+0

네, 고맙습니다. – Joe