首先,您的处理类不应扩展 Form1 . 这会给你一种幻觉,你可以访问现有表单的方法,但是当你这样做时,它会创建一个全新的表单,而不是显示它 . 该表单使's own set of all instance fields, so you'无法访问主表单的控件 . 即使这样可行(并且它赢得了't) it'不是一个设计良好的解决方案 .
这样做的正确方法实际上要容易得多 . 你只需要让你的另一个类从它的方法中返回一个值:
public class PrintClass
{
public string DoWork()
{
Thread.Sleep(2000);//placeholder for real work.
return "Process Completed";
}
}
现在,您的主窗体可以调用该方法并将返回值附加到文本框 .
执行此操作后,您将在工作发生时阻止该UI线程,从而防止重新绘制表单或处理任何其他事件 . 您需要在后台线程中完成工作,然后编组回UI线程以使用结果更新UI . 有很多方法可以做到这一点,但如果你使用 await C#5.0是最简单的方法:
public class Form1 : Form
{
private void SomeEventHandler(object sender, EventArgs args)
{
string result = await Task.Run(()=>new PrintClass().DoWork());
TboxPrint.AppendText(result);
}
}
如果你需要一个C#4.0解决方案,你可以使用 ContinueWith ,这或多或少是上面要翻译的内容,但它不是那么干净的语法 .
public class Form1 : Form
{
private void SomeEventHandler(object sender, EventArgs args)
{
Task.Factory.StartNew(()=>new PrintClass().DoWork())
.ContinueWith(t => TboxPrint.AppendText(t.Result)
, CancellationToken.None
, TaskContinuationOptions.None
, TaskScheduler.FromCurrentSynchronizationContext());
}
}