C#在程序中构造函数

C#在程序中构造函数,c#,asynchronous,C#,Asynchronous,我在C#中有一个表单应用程序,它在UI线程上完成它所需要的一切。它在计算上并不昂贵,但相当耗时,因为它会等待其他系统的响应,并在此期间锁定UI 下面是我日常工作的一个片段 private void btnRun_Click(object sender, EventArgs e) { TextAppend("Checking Laser Marker TCP/IP..."); foreach(string t in Steps) {

我在C#中有一个表单应用程序,它在UI线程上完成它所需要的一切。它在计算上并不昂贵,但相当耗时,因为它会等待其他系统的响应,并在此期间锁定UI

下面是我日常工作的一个片段

private void btnRun_Click(object sender, EventArgs e)
    {

        TextAppend("Checking Laser Marker TCP/IP...");

        foreach(string t in Steps)
        {
            var itm = new ListViewItem(t);
            listView1.Items.Add(itm);
        }
        listView1.Items[0].BackColor = Color.PaleGoldenrod;
        progressBar1.Value = 0;
        LabelShows(1);

        //Check the TCP/IP connection
        progressBar1.Value = 21;

        bool checkIP = RunModule.CheckConnection("GI SN", IP, port, this);

        if (checkIP == false)
        {
            listView1.Items[0].BackColor = Color.Red;
            MessageOK("Failed to connect to the Laser Marker! Please check IP, Port and serial numbers match the Laser marker.", "warn");

            LabelShows(0);
            return;
        }
     }
该科:

bool checkIP = RunModule.CheckConnection("GI SN", IP, port, this);

    if (checkIP == false)
    {
        listView1.Items[0].BackColor = Color.Red;
        MessageOK("Failed to connect to the Laser Marker! Please check IP, Port and serial numbers match the Laser marker.", "warn");

        LabelShows(0);
        return;
    }
在具有不同功能的例程的后续几次中以类似的方式发生。所有函数都从不同的类运行


我曾考虑过使用backgroundworkers,但这些报告的是进度,而不是bool。我已经看过了
Task.Run()
,但是我看不到实现它的方法。有人能就如何更好地组织我的日常工作提供建议吗?

您可以使用BackgroundWorker来实现您的目标。
键是
dowworkeventargs
,它具有传递给
RunWorkerCompleted
事件的属性
Result
。(RunWorkerCompleted事件在UI线程中运行):


可能重复感谢您的回复!我可以告诉我的主UI线程在继续之前等待
e.result
返回吗?主线程要求任务按顺序发生。
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
  ...
  e.Result = RunModule.CheckConnection("GI SN", IP, port, this);
}

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  var checkIP = (bool) e.Result;

  if (checkIP == false)
  {
    listView1.Items[0].BackColor = Color.Red;
    MessageOK("Failed to connect to the Laser Marker! Please check IP, Port and serial numbers match the Laser marker.", "warn");

    LabelShows(0);
  }
}