C#:Task Factory重复启动任务?

时间:2015-12-02 13:29:10

标签: c# multithreading

我对任务工厂有一个简单的问题。我必须遵循以下代码:

此任务是一个循环,它从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”正在重复,直到超时停止此任务为止。

感谢您的帮助:)

编辑:添加了一些遗漏代码。

1 个答案:

答案 0 :(得分:0)

正如丹尼斯所说,问题似乎来自失踪的波动。它现在有效,即使我不知道为什么它之前没有。