关闭任务并在开始新任务之前检查它是否不是 运行
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);
}
我有一个应用程序,当单击一个按钮时,它会启动一个连接到特定蓝牙设备的任务,然后有连续的数据流进出。当用户再次单击该按钮时,我希望它检查我第一次创建的任务是否为 运行,如果是,则终止该任务。 我正在考虑使用 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);
}