关闭任务并在开始新任务之前检查它是否不是 运行

Closing a task and checking if its not running before starting a new one

我有一个应用程序,当单击一个按钮时,它会启动一个连接到特定蓝牙设备的任务,然后有连续的数据流进出。当用户再次单击该按钮时,我希望它检查我第一次创建的任务是否为 运行,如果是,则终止该任务。 我正在考虑使用 CancellationToken 取消任务,但我无法通过检查任务是否为 运行。现在,当我第一次单击按钮时,它会创建任务并很好地完成所有工作。当我第二次点击按钮时,它仍然通过 if 语句,认为任务不是 运行 并尝试再次创建任务并再次连接蓝牙设备然后卡住。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using InTheHand;
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Ports;
using InTheHand.Net.Sockets;
using System.IO;
using System.Threading;

namespace app
{
class Bluetooth
{
    Guid mUUID = new Guid("00001101-0000-1000-8000-00805F9B34FB");
    public BluetoothClient client;
    BluetoothDeviceInfo[] devices;
    private Task connectionTask;              



    private void Connect() //This is called from button click
    {
        if (connectionTask == null ||
            connectionTask.IsCompleted == false &&
            connectionTask.Status != TaskStatus.Running && 
            connectionTask.Status != TaskStatus.WaitingToRun && 
            connectionTask.Status != TaskStatus.WaitingForActivation)
           {
            connectionTask = Task.Factory.StartNew(ConnectionTask);
           }

        else
        {
            var form1 = new Form1();
            form1.message("Client already connected", 3);                  
        }            
    }

    private void ConnectionTask()
    {
        //Do Bluetooth connection stuff here which, once connected, will stay in an infinite while loop. 

    }
 }
}

我把代码改成下面这样,但是还是只能得到Client connected messagebox。据我了解,因为我有 Thread.Sleep(100000) 任务仍应算作 运行?

class Bluetooth
{


    private Task connectionTask;


    public void bluetooth()
    {
        Connect();
    }

    private void Connect()
    {


        if (connectionTask == null ||
        connectionTask.IsCompleted == false &&
        connectionTask.Status != TaskStatus.Running &&
        connectionTask.Status != TaskStatus.WaitingToRun &&
        connectionTask.Status != TaskStatus.WaitingForActivation)
        {
            connectionTask = Task.Factory.StartNew(ConnectionTask);
        }

        else
        {
            var form1 = new Form1();
            form1.message("Client already connected", 3);                  
        }            
    }

    private void ConnectionTask()
    {

        var form1 = new Form1();
        form1.message("Client connected", 1);
        Thread.Sleep(100000);

    }
}
}

问题是,您在检查任务是否完成之前创建了一个新任务(并覆盖了实例变量)。只需删除行 connectionTask = new Task(ConnectionTask); 并另外检查 connectionTask == null 即可解决问题。

如@JanDotNet 所述,如果您在 if 语句之前初始化 connectionTask 变量,它将不起作用。

您必须将 if 语句重写为以下内容。

if (connectionTask == null ||
    connectionTask.IsCompleted == false &&
    connectionTask.Status != TaskStatus.Running && 
    connectionTask.Status != TaskStatus.WaitingToRun && 
    connectionTask.Status != TaskStatus.WaitingForActivation)
{
    connectionTask = Task.Factory.StartNew(ConnectionTask);
}