目前我有一个问题,这段代码给我一个任务,它总是在等待激活状态。
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);
}
}
这是我这边运行这篇文章时的一些调试信息。有谁知道问题出在哪里。
在调试输出中(结束):
Index: 7496, State: WaitingForActivation, Id: 21
Index: 7497, State: WaitingForActivation, Id: 21
Index: 7498, State: WaitingForActivation, Id: 21
Index: 7499, State: WaitingForActivation, Id: 21
Index: 7500, State: WaitingForActivation, Id: 21
Index: 7501, State: WaitingForActivation, Id: 21
Index: 7502, State: WaitingForActivation, Id: 21
Index: 7503, State: WaitingForActivation, Id: 21
不同运行的任务窗口,但应该有相同的目的: Task Window
更新:
如果我这样做,它不会在 90% 的时间内进入 continueWith。有点奇怪。
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 = "";
});
更新 2:
一段时间后。 15 分钟?我得到了这个错误:
对 ASTA(线程 9164)的 COM 调用(IID:{45180254-082E-5274-B2E7-AC0517F44D07},方法索引:8)出现死锁并超时。)
有人知道这是怎么回事吗?
最佳答案
您需要对代码进行一些更改。
你应该编写 public async Task GetAvailablePorts
而不是 public static void GetAvailablePorts
然后你应该写 var devices = await task; 而不是
var devices = task.Result;
;
可以在此处找到了解异步/等待模式的良好引用:https://markheath.net/post/async-antipatterns
关于c# - 任务始终处于等待激活状态(查找所有串行设备),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40175012/