【发布时间】:2019-05-27 20:31:21
【问题描述】:
我有一个使用 WPF MVVM 的 .NET 4.7.2 应用程序。我正在使用制造商提供的库连接到机器人。不幸的是,当 IP 参数错误时,他们连接到机器人的方法会停止 30 秒,这实际上会冻结 UI。
我决定使用 async/await 来解决这个问题,基于this 我认为这是一个 I/O-Bound 问题,但由于我用来连接机器人的方法是同步,我不能等待它。在示例中,我看到他们通常首先使用异步库,当第 3 方提供的同步方法冻结我的 UI 时,我找不到如何解决这个问题。
第一个代码 sn-p 不起作用,当我尝试连接时,我的 UI 停止了 30 秒。
public async Task<bool> ConnectToRobot(string ip = "")
{
if (FanucController.IsConnected)
return true;
var result = await ConnectToFanuc(ip);
return result;
}
private Task<bool> ConnectToFanuc(string ip)
{
try
{
((IRobot)FanucController).Connect(ip);
// Other code for connection
return Task.FromResult(true);
}
catch
{
return Task.FromResult(false);
}
}
最终我通过使用 CPU-Bound 示例(第二个代码 sn-p)解决了这个问题,但是,这并不是一个真正的 CPU-bound 问题,因此我不确定这是否会在未来引起问题。
public async Task<bool> ConnectToRobot(string ip = "")
{
if (FanucController.IsConnected)
return true;
var result = await Task.Run(() => ConnectToFanuc(ip));
return result;
}
private bool ConnectToFanuc(string ip)
{
try
{
((IRobot)FanucController).Connect(ip);
// Other code for connection
return true;
}
catch
{
return false;
}
}
有没有更好的方法来解决这个问题?我应该使用 async/await 关键字以外的东西吗?
【问题讨论】:
-
Cpu bound 与否,你探测原始
ConnectToFanuc的方式是错误的,除了你之外,这个方法没有任何async返回一个Task,如果Connect没有async变体,你将不得不像你正在做的那样卸载它到另一个线程,但这仍然是可疑的
标签: c# wpf asynchronous async-await