首先,你的處理類不應該延伸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