所以我试图在我的Windows窗体项目中实现多线程。我知道一种方法,通过为你想要单独运行的方法创建一个新线程,如下所示:
Thread t = new Thread(new ThreadStart(methodName));
t.Start();
然后调用每个对象"从除了创建它的线程以外的线程访问。"像这样:
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");
}));
答案 0 :(得分:1)
解决此问题的一种方法是利用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
。结果是#34;不再是丑陋的代码!"。
如果您不熟悉async / await you can start here和here