使用任务并行库(TPL)进行轮询

本文关键字:TPL 任务 并行 | 更新日期: 2023-09-27 18:04:51

我是c#新手,我有一个设备(外设),我需要从c#控制台应用程序通过串行/USB轮询。虽然下面的代码显然没有抛出任何异常(错误),但它也没有执行轮询。会发生什么?谢谢。

控制台输出为:

Here goes...
t1: System.Threading.Tasks.Task

PD。从调试中,我有while(true){…}块未运行。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using T1NET;
namespace ValController
{
    class Program
    {
        static void Main(string[] args)
        {
            T1NET.comm Device = new T1NET.comm();
            bool devfound = true;
            Device.Port = new T1NET.COM_port();
            Device.Port.RtsEnable = false;
            Device.HandlePort = true;
            Device.Port.BaudRate = 9600;
            Device.Port.PortName = "COM4";
            Device.Device = T1NET.Device.Valid;
            Device.Port.ReadTimeout = 100;
            if (devfound)
            {
                BV_Device.HandlePort = true;
                Console.WriteLine("here goes...");
                var t1 = Task.Factory.StartNew(() =>
                {
                    while (true)
                    {
                        System.Threading.Thread.Sleep(100);
                        System.Threading.Thread.BeginCriticalRegion();
                        T1NET.Answer answer = Device.RunCommand(T1NET.T1NETCommand.Poll);
                        Console.WriteLine("answerswer:" + answer);
                    }
                });
                Console.WriteLine("t1: " + t1);
            }
        }
    }
}

使用任务并行库(TPL)进行轮询

在您的示例中,您启动了一个新的异步任务,而与此同时,您的应用程序继续执行直到Main方法结束,并且在新任务甚至有机会执行其内容(在您的示例中是while loop)之前突然退出。

您需要等待您的任务完成(或者在您的情况下,执行直到您杀死它)。试着这样组织你的代码:

static void Main(string[] args)
{
    //// Your initialization code
   if (devfound)
   {
        //// Device found, prepare for task
        var t1 = Task.Factory.StartNew(() =>
        {
            //// Task body
        });
        t1.Wait();
   }
}

当你做异步编程时,当你在做其他事情时,你启动一个单独的任务来执行操作,那么你应该在某个时间点等待其他任务的结果。

你不知道其他任务什么时候开始,除非你开始摆弄优先级之类的东西。由操作系统决定在您的哪个语句之后启动其他任务。因此,在对自己进行一些处理之后,你永远无法确定其他任务是否已经启动以及它已经完成了什么,除非你开始等待其他任务的一些生命迹象。

您可以检查其他任务的状态,但是您只知道它是否开始运行,也许它只执行了第一条语句。你永远无法确定它什么时候会执行下一个语句。

了解其他任务状态的正确方法:-等待它完成。如果你只需要结果就很有用-等待一些信号量/事件等被发出信号。如果您需要随时了解其他任务进度

,则非常有用。