我在问题上非常需要你的帮助,这与前一期非常接近。 我想使用主线程中的线程来调用函数。
有关更多解释,以下是我的代码中的示例: //请查看从(// -------)
开始的代码 // this function is being called from the Form1 class Like this
//(this.Load += new System.EventHandler(this.Form1_Load);)
private void Form1_Load(object sender, EventArgs e)
{
Common.MainForm = this;
ftpServerIP = "74.220.215.77/ASGAQuraan";
ftpUserID = "sanbouk@asgatech.com";
ftpPassword = "asga_root";
iStartConnection = true;
iGetNarratorData = false;
iGetNarratorsSuras = false;
_isExpandedIndecies = new string[10];
refreshPhons = true;
count = 0;
_btnDownload2PC.Enabled = false;
_btnDownload2Phone.Enabled = false;
//--------------------------------------------------------------------------------------
//timer1.Tick() is a function which Gets Data rom Phone
//Now, GetFromServer, and GetFromPC are 2 functions which i want to them
// to work in paralel with Timer1.Tick()
//So, Fincally i want all 3 function work together with no gabs
Timer1.Enabled = true;
Timer1.Start();
if (InvokeRequired)
{
Invoke(new GetFromServerHandler(GetFromServer));
}
else
{
ServerQuranTreeView.Nodes.Clear();
GetFromServer();
GetFromPC();
}
}
**注意:在GetFromServer和GetFromPC中,我将更新主线程中的树 Form1(GUI)和当我尝试使用线程(线程_t =新线程(新的ThreadStart(GetFromServer)))时出现此错误: “正在从错误的线程调用正在对此控件执行的操作。使用Control.Invoke或Control.BeginInvoke将Marshal连接到正确的线程以执行此操作。”**
我希望我能很好地解释我的问题。
提前致谢。
答案 0 :(得分:4)
您无法从其他线程对UI进行操作 - 但您可以让GetFromServer和GetFromPC 获取其他线程上的数据,然后调用Control.Invoke返回UI线程来更新树视图。
请参阅my threading article,例如在另一个线程中执行后台工作,然后再进行编组。这篇文章是在C#2之前编写的,所以现在这些文章略显笨重。您还可以使用BackgroundWorker来更轻松地报告进度等。
答案 1 :(得分:1)
对于任何只获取数据然后更新GUI然后完成直到下次有人调用它的单个操作, 使用BackgroundWorker。
它是一个为您简化线程编码的类。这样你就可以在一个函数中编写用于获取数据的代码,以及一个在之后显示获取数据的方法。
然后只要提取数据就调用它。
BackgroundWorker非常适合任何GUI解决方案,您可以在其中单击在后台执行某些操作并随后更新内容的按钮。它还支持在获取数据时更新GUI。