C#:任务工厂重复启动任务

本文关键字:任务 启动 工厂 | 更新日期: 2023-09-27 18:25:24

关于任务工厂,我有一个可能很简单的问题。我必须遵循以下代码:

在这个任务中,有一个从RS232轮询数据的循环和一个在10次后停止轮询的计数器。在此之后,"doCollect"将设置为false。

现在出现了一件奇怪的事情:任务重复运行。呼叫者代码为:

// class Main()
RS232DataAquisition _RS232DataAquisition = new RS232DataAquisition();
public override void Run()
{
    System.Diagnostics.Stopwatch timeout = new System.Diagnostics.Stopwatch();
    timeout.Start();
    _RS232DataAquisition.Start();
    while ((timeout.ElapsedMilliseconds <= (dataGatherTime_inSeconds * 1000)) && _RS232DataAquisition.DoCollect)
    {
        System.Threading.Thread.Sleep(100);
    }
    timeout.Stop();
    _RS232DataAquisition.Stop();
}

根据我的理解,Run()函数应该启动线程并返回while循环,等待线程完成。但从来没有?!

这是ReadDataFromRS232:的代码

// sealed class RS232DataAquisition
private bool doCollect = false;
public bool DoCollect
{
    get { return doCollect; }
}
public void Start()
{
    doCollect = true;
    currentTask = System.Threading.Tasks.Task.Factory.StartNew(() =>
    {
        this.ReadDataFromRS232();
    });
}
private void ReadDataFromRS232(int NumtoRead = 10)
{
    var port = new System.IO.Ports.SerialPort(PortName);
    int waitCount = 5;
    var portExists = System.IO.Ports.SerialPort.GetPortNames().Any(x => x == PortName);
    if (!portExists)
    {
        throw new ArgumentException("Port does not exist!");
    }
    while (port.IsOpen && waitCount-- > 0)
    {
        doCollect = false;
        Wait();
    }
    doCollect = true;
    if (!port.IsOpen)
    {
        port.Open();
        port.NewLine = _NewLine;
        port.ReadTimeout = 2000;
        int number;
        try { }
        finally { }
        port.Write("flashon'r");
        while (doCollect && (_readCounter <= NumtoRead))
        {
            string s;
            try
            {
                s = port.ReadLine();
            }
            catch
            {
                s = "-1";
            }
            int i;
            if (int.TryParse(s, out i))
            {
                number = Convert.ToInt32(s, 10);
            }
            else
            {
                number = 0;
            }
            lock (thisLock) _data.Add(number);
            _readCounter++;
        }
        port.Write("flashoff'r");
        port.Close();
        port.Dispose();
        Wait(); Wait();
    }
}
private void Wait()
{
    System.Threading.Thread.Sleep(10);
    System.Threading.Thread.SpinWait(1);
}

我不明白,为什么"ReadDataFromRS232"一直重复,直到超时停止这个任务。

感谢您的帮助:)

编辑:添加了一些缺失的代码

C#:任务工厂重复启动任务

正如Dennis所说,问题似乎来自于缺少的volatile。它现在有效,尽管我不知道为什么以前没有。