【发布时间】:2019-05-27 19:59:53
【问题描述】:
目前我有一个问题,这段代码给了我一个总是在等待激活状态的任务。
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)出现死锁并超时。)
有人知道怎么回事吗?
【问题讨论】:
-
你应该开始任务了。
-
如果您在单个线程上运行,而 (!done) 将阻塞该线程,并且没有任何东西可以更改 RanToCompletion 状态。您不应该使用 await 或 .Continue 进行异步编程
-
这是一个承诺风格的任务。该任务不应该自动启动吗?
-
如果我使用 await 它只会挂起,所以我以这种方式重构了我的代码以查看发生了什么。
-
我认为你在 FindAllAsync 方法中有一些死锁。
标签: c# asynchronous task