2016-09-08 1 views
-2

제 생성자에서 태스크 (또는 스레드)를 정의하고 싶지만 버튼 이벤트에서 해당 메소드로 태스크 (또는 스레드)를 시작하십시오.어떤 메소드를 알리지 않고 태스크를 사용하여 생성자에게 메 시지를 전달하십시오.

Task SendTask = Task.Factory.StartNew(()); 
private void SendFilesButton_Click(object sender, EventArgs e) 
{ 
    SendTask.Sendfiles(); 
} 

내 방법 : 당신은 생성자를 사용할 수 있습니다

public void SendFiles() 
{ 
    try 
    { 
     tcpClient = tcpListener.AcceptTcpClient(); 
     if (tcpClient.Connected) 
     { 

      using (StreamReader reader = new StreamReader("C:\\Users\\Chudnofsky\\Desktop\\Projekt\\Neu\\Messwerte.txt")) 
      { 
       lock (this) 
       { 
        string line; 
        line = reader.ReadLine() + Environment.NewLine; 
        stream = tcpClient.GetStream(); 
        byte[] toSend = Encoding.ASCII.GetBytes(line); 
        stream.Write(toSend, 0, toSend.Length); 
        stream.Flush(); 
       } 
      } 
     } 
    } 
    catch (Exception) 
    { 
     System.Windows.Forms.MessageBox.Show("Datei konnte nicht gelesen werden!"); 
    } 
} 
+0

작업을 관리하고 싶지만 정의하고 시작하기를 원할 것입니다.'var SendTask = new Task (Sendfiles); SendFilesButton_Click (개체 보낸 사람, EventArgs 전자) {SendTask.Start(); }'. 또한,'lock (this)'이 당신을 위해 작동하지 않을 수도 있습니다. 보통 각 태스크에 공통적 인 객체를 잠그고 싶습니다. 10 개의 작업으로 10 개의 다른 잠금을 얻을 수 있지만 각'SendFiles()'메소드 사이에 경합이 있다면 단지 하나의 잠금만을 원할 것입니다. – Quantic

+2

'Task SendTask;를 수행하는 데있어 잘못된 점이 있습니다. 개인 무효 SendFilesButton_Click (개체 보낸 사람, EventArgs 전자) {SendTask = Task.Run (SendFiles); }'? –

+0

@ScottChamberlain 버튼을 두 번 클릭했을 때의 동작은 두 경우 모두 완전히 다릅니다. – Servy

답변

0

,이 같은 :

그래서 내가 이런 걸 원하는

Task SendTask = new Task(new Action(SendFile)); 

및 이벤트 핸들러에서를 단순히 확인으로 시작하십시오. it's status :

private void SendFilesButton_Click(object sender, EventArgs e) 
{ 
    if (SendTask.Status == TaskStatus.Created) 
    { 
     SendTask.Start(); 
     SendFilesButton.Enabled = false; 
    } 
} 

lock (this) 구조는 사용자의 UI 양식을 잠 그게하므로 피해야합니다.

관련 문제