使用任务并行库 (TPL) 进行轮询
Using task parallel library (TPL) for polling
我是 C# 的新手,我有一个设备(外围设备)需要从 C# 控制台应用程序通过 serial/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("answer:" + answer);
}
});
Console.WriteLine("t1: " + t1);
}
}
}
}
在您的示例中,您启动了一个新的异步任务,同时您的应用程序继续执行到 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();
}
}
每当您进行异步编程,并在执行其他操作的同时启动一个单独的任务来执行操作时,您应该及时等待其他任务的结果。
正式你不知道其他任务什么时候开始,除非你开始摆弄优先级和东西。由操作系统决定在您的哪个语句之后另一个任务开始。因此,在对自己进行一些处理之后,您永远无法确定另一个任务是否已经开始以及它做了什么,除非您开始等待另一个任务的生命迹象。
您可以查看其他任务的状态,但您只能知道它是否开始运行,也许它只执行了第一条语句。您永远无法确定它何时执行下一条语句。
了解其他任务状态的正确方法:
- 等待它完成。如果您只需要结果,则很有用
- 等待一些信号量/事件/等发出信号。如果您需要随时了解其他任务进度,这很有用
我是 C# 的新手,我有一个设备(外围设备)需要从 C# 控制台应用程序通过 serial/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("answer:" + answer);
}
});
Console.WriteLine("t1: " + t1);
}
}
}
}
在您的示例中,您启动了一个新的异步任务,同时您的应用程序继续执行到 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();
}
}
每当您进行异步编程,并在执行其他操作的同时启动一个单独的任务来执行操作时,您应该及时等待其他任务的结果。
正式你不知道其他任务什么时候开始,除非你开始摆弄优先级和东西。由操作系统决定在您的哪个语句之后另一个任务开始。因此,在对自己进行一些处理之后,您永远无法确定另一个任务是否已经开始以及它做了什么,除非您开始等待另一个任务的生命迹象。
您可以查看其他任务的状态,但您只能知道它是否开始运行,也许它只执行了第一条语句。您永远无法确定它何时执行下一条语句。
了解其他任务状态的正确方法: - 等待它完成。如果您只需要结果,则很有用 - 等待一些信号量/事件/等发出信号。如果您需要随时了解其他任务进度,这很有用