首先,你的处理类不应该延伸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());
}
}
从你提供的代码看起来像append_Tbox函数是在同一个类中。我是否正确 – Vikram 2013-02-25 05:24:04
@Vikram,类'PrintClass'继承'form1',这就是为什么我可以直接调用方法。 – Liban 2013-02-25 05:26:25
@ Liban-你不能访问类的TxtBox,因为两个控件都是私有的,请参阅Designer.cs – 2013-02-25 05:37:30