首先,您的处理类不应该扩展Form1
. 这给您一种错觉,即您可以访问现有表单的方法,但它并没有按照您的想法进行操作。当你这样做时,你正在创建一个全新的表单,只是没有显示它。该表单具有自己的所有实例字段集,因此您无需访问主表单的控件。即使这会起作用(并且不会),它也不是一个设计良好的解决方案。
这样做的正确方法实际上要容易得多。你只需要让你的其他类从它的方法返回一个值:
public class PrintClass
{
public string DoWork()
{
Thread.Sleep(2000);//placeholder for real work.
return "Process Completed";
}
}
现在您的主窗体可以调用该方法并将返回值附加到文本框。
一旦你这样做,你将有一个完全独立的问题。如果您在 UI 线程中进行工作,您将在工作发生时阻塞该 UI 线程,从而阻止重新绘制表单或处理任何其他事件。您需要在后台线程中完成工作,然后编组回 UI 线程以使用结果更新 UI。有很多方法可以做到这一点,但如果你有 C# 5.0,那么使用await
是迄今为止最简单的:
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());
}
}