C# 任务始终处于等待激活状态(查找所有串行设备)
目前我有一个问题,这段代码给了我一个任务,它总是在等待激活状态C# 任务始终处于等待激活状态(查找所有串行设备),c#,asynchronous,task,C#,Asynchronous,Task,目前我有一个问题,这段代码给了我一个任务,它总是在等待激活状态 public static void GetAvailablePorts(List<string> ports, int timeOut) { var selector = SerialDevice.GetDeviceSelector(); var task = DeviceInformation.FindAllAsync(selector).AsTask(); I
public static void GetAvailablePorts(List<string> ports, int timeOut)
{
var selector = SerialDevice.GetDeviceSelector();
var task = DeviceInformation.FindAllAsync(selector).AsTask();
Int64 i = 0;
bool done = false;
while (!done)
{
Debug.WriteLine(String.Format("Index: {0}, State: {1}, Id: {2}", i, task.Status.ToString(), task.Id));
i++;
if(TaskStatus.RanToCompletion == task.Status)
done = true;
}
var devices = task.Result;
foreach (var d in devices)
{
ports.Add(d.Id);
}
}
不同运行的任务窗口,但应具有相同的用途:
更新:
如果我这样做的话,90%的时间都不会持续下去。有点奇怪
var selector = SerialDevice.GetDeviceSelector();
return DeviceInformation.FindAllAsync(selector).AsTask().ContinueWith((Task<DeviceInformationCollection> previous) =>
{
var devices = previous.Result;
foreach (var d in devices)
{
ports.Add(d.Id);
}
string b = "";
});
var选择器=SerialDevice.GetDeviceSelector();
返回设备信息.FindAllAsync(选择器).AsTask().ContinueWith((上一个任务)=>
{
var设备=先前的结果;
foreach(设备中的var d)
{
端口。添加(d.Id);
}
字符串b=“”;
});
更新2:
过了一段时间。15分钟?我得到了这个错误:
对ASTA(线程9164)的COM调用(IID:{45180254-082E-5274-B2E7-AC0517F44D07},方法索引:8)出现死锁并超时。)
有人知道发生了什么吗?您需要对代码进行一些更改 您应该编写
公共异步任务getavailableport
然后在后面代替var devices=task.Result代码>您应该编写var设备=等待任务代码>
可以在此处找到理解异步/等待模式的好参考:您应该启动任务。如果您在单个线程上运行,而(!done)将阻止该线程,并且任何内容都无法更改RANTO完成状态。对于异步编程,不应使用wait或.Continue执行此操作。这是一项承诺式任务。该任务不应该自动启动吗?如果我使用wait,它将挂起,因此我以这种方式重构代码以查看发生了什么。我认为findalsync方法中存在一些死锁。
var selector = SerialDevice.GetDeviceSelector();
return DeviceInformation.FindAllAsync(selector).AsTask().ContinueWith((Task<DeviceInformationCollection> previous) =>
{
var devices = previous.Result;
foreach (var d in devices)
{
ports.Add(d.Id);
}
string b = "";
});