У меня есть приложение .NET 4.7.2, использующее WPF MVVM. Я подключаюсь к роботу, используя предоставленную библиотеку от производителя. К сожалению, их метод, который подключается к роботу, останавливается на 30 секунд, когда параметр IP неверен, и это по существу замораживает пользовательский интерфейс.
Я решил использовать async / await для решения этой проблемы, основываясь на this Я подумал, что это проблема ввода-вывода, но поскольку метод, который я использую для подключения к роботу, - это синхронизация, Я не мог ждать этого. В примерах, которые я видел, они обычно использовали асинхронные библиотеки в первую очередь, и я не мог найти, как решить эту проблему, когда метод синхронизации, предоставленный сторонней организацией, замораживает мой пользовательский интерфейс.
Первый фрагмент кода не работал, мой интерфейс остановился на 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);
}
}
В конце концов я справился с этим, используя пример с привязкой к ЦП (второй фрагмент кода), однако на самом деле это не проблема, связанная с ЦП, поэтому я не уверен, что это вызовет проблемы в будущем.
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?