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

时间:2017-06-05 13:12:17

标签: c# bluetooth task cancellation-token

我有一个应用程序,当点击一个按钮时,它启动一个连接到特定蓝牙设备的任务,然后有一个连续的数据流进出。当用户再次点击该按钮时,我希望它检查,如果我第一次创建的任务正在运行,如果是,则终止任务。 我正在考虑用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. 

    }
 }
}

我已将代码更改为以下内容,但仍然只获取客户端连接的消息框。据我了解,因为我有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);

    }
}
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

正如@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);
}