2016-09-08 3 views
-2

私のコンストラクタでタスク(またはスレッド)を定義したいが、そのメソッドでボタンイベントでタスク(またはスレッド)を開始する。コンストラクタimをどのメソッドに通知せずにタスクを使用するかを教えてください

だから私はこのような何かしたい:

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

私の方法:

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

と単純にイベントハンドラで:あなたはこのように、コンストラクタを使用することができます

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 e){SendTask.Start(); } '。また、 'lock(this)'がうまく動作しないかもしれませんが、通常、各タスクに共通のオブジェクトをロックしたいとします。 10個のタスクで10個のロックを取得するだけですが、各 'SendFiles()'メソッドの間に競合がある場合、ロックは1つだけ必要です。 – Quantic

+2

'Task SendTask;を実行すると何が問題になりますか?プライベートvoid SendFilesButton_Click(オブジェクト送信者、EventArgs e) {SendTask = Task.Run(SendFiles); } '? –

+0

@ScottChamberlain 2つのケースでボタンを2回クリックしたときの動作はまったく異なります。 – Servy

答えて

0

をチェックで開始してくださいit's status

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

あなたのUIフォームをロックするので、lock (this)の構築は避けてください。

関連する問題