【问题标题】:C# structuring functions within a program程序中的 C# 结构化函数
【发布时间】:2018-03-23 17:10:04
【问题描述】:

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

下面是我日常的一个sn-p。

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;
    }

在具有不同功能的例程中以类似的方式多次发生。所有函数都从不同的类运行。

我研究过使用后台工作人员,但这些报告进度而不是布尔值。我看过Task.Run(),但我看不到实现它的方法。谁能提供关于如何更好地安排我的日常工作的建议?

【问题讨论】:

标签: c# asynchronous


【解决方案1】:

您可以使用 BackgroundWorker 来实现您想要的。
键是DoWorkEventArgs,它具有Result 属性,它被传递给RunWorkerCompleted 事件。 RunWorkerCompleted 事件在 UI 线程中运行)

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);
  }
}

【讨论】:

  • 感谢您的回复!我可以告诉我的主 UI 线程在继续之前等待返回 e.result 吗?主线程要求任务按顺序发生。
猜你喜欢
  • 2010-10-31
  • 1970-01-01
  • 2018-08-30
  • 2016-05-02
  • 1970-01-01
  • 2010-09-27
  • 2020-11-09
  • 2021-05-24
  • 1970-01-01
相关资源
最近更新 更多