异步任务和多线程UI

时间:2019-04-13 16:15:43

标签: c# multithreading

我正在开发一个类似于工作流应用程序的应用程序,请将其想象为计算机零件组装应用程序。在第一工位组装键盘,在第二工位组装鼠标,在第三工位组装主板(有10个工位)。

为识别操作员必须组装的零件,数据被发送到PLC,PLC依次打开每个包含组装零件的工具箱的灯。然后,操作员扫描装配零件并将数据通过PLC发送到我们的应用程序。

此应用程序用于查看所有电台的状态。每个站都有以下步骤:

  1. 从PLC启动命令
  2. 将装配零件清单发送到PLC
  3. 从数据库中的PLC验证扫描详细信息并发送扫描状态
  4. 接收操作详细信息并存储在数据库中

我有两个问题:

A。我们有一个用例,其中用户想要检查要在UI中组装的零件。因此,在用户界面中,我们包含3个组件:

  1. 汽车名称
  2. 状态
  3. 查看装配零件

当用户单击“查看装配零件”时,他想查看装配零件列表。如果需要显示装配零件,那么我们可以从数据库中为每个工作站提取数据并进行显示,但是这里要技巧,因为每个工作站的操作步骤都在单独的线程中运行,如何更新弹出窗口(可能是在单独的线程中运行)呼叫callAsyncProcess)。

B。我想在单独的线程中运行每个工作站操作,下面的代码对吗?在callAsyncProcess中,我正在调用单独的线程,我不想在调用另一个任务之前等待该任务完成,但是我想在某个时间后超时,callAsyncProcess中的代码对吗?

下面是操作代码

public async void callAsyncProcess(Label label, Label prevStationLabel, int stationId, string scannedBarCode, ushort startCmdadr, ushort refAdr)
{
    var task =automaticStepsTask(label, prevStationLabel, stationId, scannedBarCode, startCmdadr, refAdr);
    if (Task.WhenAny(task, Task.Delay(timeout)) == task)
    {
        // task completed within timeout
    }
    else
    {
        Console.WriteLine("timeout for station "+stationId);
    }
    Console.WriteLine("AUTOMATIC STEP COMPLETED "+stationId);
}

public Task automaticStepsTask(Label label, Label prevStationLabel, int stationId, string scannedBarCode, ushort startCmdadr, ushort refAdr)
{
    return Task.Run(() =>
    {
     // other operation
      scanChildNOk(staionId,scannedBarcode,Childlist);
    });
}

void scanChildNOk(int stationId, string stationModelName, List<string> childCompList)
{
    // operation related to scanning 
    // need to update ui from here
}

我需要在以上代码中使用await关键字吗?

0 个答案:

没有答案