C# 告诉构造函数我正在使用任务,但不告诉它使用哪种方法

C# 告诉构造函数我正在使用任务,但不告诉它使用哪种方法,c#,multithreading,C#,Multithreading,我想在构造函数中定义一个任务(或线程),但在按钮事件中用它的方法启动任务(或线程) 所以我想要这样的东西: Task SendTask = Task.Factory.StartNew(()); private void SendFilesButton_Click(object sender, EventArgs e) { SendTask.Sendfiles(); } 我的方法: public void SendFiles() { try { tcpCl

我想在构造函数中定义一个任务(或线程),但在按钮事件中用它的方法启动任务(或线程)

所以我想要这样的东西:

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!");
    }
}

您可以使用构造函数,如下所示:

Task SendTask = new Task(new Action(SendFile));
在事件处理程序中,只需从检查开始:


您应该避免使用
锁定(this)
构造,因为它会锁定您的UI表单。

您可能希望管理任务,但要定义并启动它,您可能需要:
var SendTask=new task(Sendfiles);SendFilesButton_单击(对象发送者,事件参数e){SendTask.Start();}
。另外,
lock(这个)
可能对您不起作用,您通常希望每个任务都有一个通用的对象来锁定。对于10个任务,您只需要获得10个不同的锁,但是如果每个
SendFiles()
方法之间存在争用,那么您只需要1个锁;private void SendFilesButton_Click(object sender,EventArgs e){SendTask=Task.Run(SendFiles);}?@ScottChamberlain两次单击按钮的行为在这两种情况下完全不同。
private void SendFilesButton_Click(object sender, EventArgs e)
{
    if (SendTask.Status == TaskStatus.Created)
    {
        SendTask.Start();
        SendFilesButton.Enabled = false;
    }
}