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