目前我有一个问题,这段代码给了我一个始终在等待激活状态的任务。
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分钟?我收到了这个错误:
COM调用(IID:{45180254-082E-5274-B2E7-AC0517F44D07},方法索引:8)到ASTA(线程9164)出现死锁并超时。)
任何人都知道发生了什么事?
答案 0 :(得分:0)
您将需要对代码进行一些更改。
您应该写public static void GetAvailablePorts
而不是public async Task GetAvailablePorts
然后稍后应写var devices = task.Result;
而不是var devices = await task;
可以在以下位置找到了解异步/等待模式的良好参考:https://markheath.net/post/async-antipatterns