从主线程调用函数并使其与主线程中的函数并行工作

时间:2008-12-03 11:05:43

标签: c#

我在问题上非常需要你的帮助,这与前一期非常接近。 我想使用主线程中的线程来调用函数。

有关更多解释,以下是我的代码中的示例: //请查看从(// -------)

开始的代码
    // 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连接到正确的线程以执行此操作。”**

我希望我能很好地解释我的问题。

提前致谢。

2 个答案:

答案 0 :(得分:4)

您无法从其他线程对UI进行操作 - 但您可以让GetFromServer和GetFromPC 获取其他线程上的数据,然后调用Control.Invoke返回UI线程来更新树视图。

请参阅my threading article,例如在另一个线程中执行后台工作,然后再进行编组。这篇文章是在C#2之前编写的,所以现在这些文章略显笨重。您还可以使用BackgroundWorker来更轻松地报告进度等。

答案 1 :(得分:1)

对于任何只获取数据然后更新GUI然后完成直到下次有人调用它的单个操作, 使用BackgroundWorker。

它是一个为您简化线程编码的类。这样你就可以在一个函数中编写用于获取数据的代码,以及一个在之后显示获取数据的方法。

然后只要提取数据就调用它。

BackgroundWorker非常适合任何GUI解决方案,您可以在其中单击在后台执行某些操作并随后更新内容的按钮。它还支持在获取数据时更新GUI。