多线程 C# Windows 表单
Multi Threading C# Windows Forms
所以我正在尝试在我的 windows 表单项目中实现多线程。我知道一种方法可以做到这一点,方法是为您想要 运行 的方法创建一个新线程,如下所示:
Thread t = new Thread(new ThreadStart(methodName));
t.Start();
然后像这样调用每个 "Accessed from a thread other than the thread it was created on." 的对象:
this.Invoke(new MethodInvoker(delegate()
{
this.Object = "whatever";
}));
唯一的问题是,我的程序有几千行那么长,而且我一直在引用。因此,在我想在另一个线程中更改的每一件小事周围放置一个方法调用程序似乎效率极低,我确信有更好的方法,但我似乎无法在网上找到它,所以我想为什么不问问你们。
有什么我可以在方法开头说的,如果在线程外引用对象,将自动委托对象吗?因为如果没有其他方法,我的代码可能会变得非常混乱且难以阅读。 :(
编辑:这是一个更大的代码块,也许它会让这更清楚一点:
foreach (var lines in serversToRunTextBox.Lines)
{
manipulationTextBox.Text = lines;
string line = manipulationTextBox.Text;
string scriptWithWild = actualScriptTextBox.Text.Replace(wildCard.ToString(), line);
shellStream.WriteLine(scriptWithWild);
Thread.Sleep(100);
client.RunCommand(scriptWithWild);
//MessageBox.Show(scriptWithWild);
Thread.Sleep(2500);
reply = shellStream.Read();
if (reply.Contains("denied"))
{
MessageBox.Show("You must have sudo access for this command", "No Sudo", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
else
{
this.Invoke(new MethodInvoker(delegate()
{
actualResultsTextBox.AppendText(reply + "\n \n");
}));
处理此问题的一种方法是利用 C# 5.0 附带的 async/await 功能。
private async Task DoSomethingAsync()
{
//Some code
string text = await GetSomeTextAsync(somrParam);
statusTextBox.Text = text;//Will execute in captured context
//Some more code
}
await
关键字后的代码将在捕获的上下文中执行。因此,如果您在 UI 线程中调用了 DoSomethingAsync
,则 statusTextBox.Text = text;
将在 UI 线程本身中执行。所以你不需要调用this.Invoke
。结果是 "No more ugly code!!".
如果您不熟悉 async/await you can start here and here
所以我正在尝试在我的 windows 表单项目中实现多线程。我知道一种方法可以做到这一点,方法是为您想要 运行 的方法创建一个新线程,如下所示:
Thread t = new Thread(new ThreadStart(methodName));
t.Start();
然后像这样调用每个 "Accessed from a thread other than the thread it was created on." 的对象:
this.Invoke(new MethodInvoker(delegate()
{
this.Object = "whatever";
}));
唯一的问题是,我的程序有几千行那么长,而且我一直在引用。因此,在我想在另一个线程中更改的每一件小事周围放置一个方法调用程序似乎效率极低,我确信有更好的方法,但我似乎无法在网上找到它,所以我想为什么不问问你们。
有什么我可以在方法开头说的,如果在线程外引用对象,将自动委托对象吗?因为如果没有其他方法,我的代码可能会变得非常混乱且难以阅读。 :(
编辑:这是一个更大的代码块,也许它会让这更清楚一点:
foreach (var lines in serversToRunTextBox.Lines)
{
manipulationTextBox.Text = lines;
string line = manipulationTextBox.Text;
string scriptWithWild = actualScriptTextBox.Text.Replace(wildCard.ToString(), line);
shellStream.WriteLine(scriptWithWild);
Thread.Sleep(100);
client.RunCommand(scriptWithWild);
//MessageBox.Show(scriptWithWild);
Thread.Sleep(2500);
reply = shellStream.Read();
if (reply.Contains("denied"))
{
MessageBox.Show("You must have sudo access for this command", "No Sudo", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
else
{
this.Invoke(new MethodInvoker(delegate()
{
actualResultsTextBox.AppendText(reply + "\n \n");
}));
处理此问题的一种方法是利用 C# 5.0 附带的 async/await 功能。
private async Task DoSomethingAsync()
{
//Some code
string text = await GetSomeTextAsync(somrParam);
statusTextBox.Text = text;//Will execute in captured context
//Some more code
}
await
关键字后的代码将在捕获的上下文中执行。因此,如果您在 UI 线程中调用了 DoSomethingAsync
,则 statusTextBox.Text = text;
将在 UI 线程本身中执行。所以你不需要调用this.Invoke
。结果是 "No more ugly code!!".
如果您不熟悉 async/await you can start here and here