我已经创建了一个用于测试MQTT的WP 8.1应用程序(MQTT Tester)。
我已根据M2MQTT Client所做的出色工作开展应用程序。谢谢!
当使用MqttClient的Connect功能时,我希望不同步地执行此操作。为此,我创建了这个扩展名:
public static class MqttClientEx
{
public static async Task<byte> ConnectAsync(this MqttClient client,
string clientId,
string username,
string password,
bool cleanSession,
ushort keepAlivePeriod,
bool willRetain = false,
byte willQosLevel = 0,
bool willFlag = false,
string willTopic = "",
string willMessage = "")
{
var t = Task.Run(() =>
{
return client.Connect(
clientId: clientId,
username: username,
password: password,
willRetain: willRetain,
willQosLevel: willQosLevel,
willFlag: willFlag,
willTopic: willTopic,
willMessage: willMessage,
cleanSession: cleanSession,
keepAlivePeriod: keepAlivePeriod);
});
return await t;
}
}
即使在MQTT Connect需要一段时间的情况下,这也可确保UI线程具有响应能力。它还确保在用户键入错误的mqtt代理地址或代理不可用的情况下,UI线程不会锁定。
它有效,但它也引入了我不理解的副作用,而且我无法减轻:
当我按下订阅按钮(UI的一部分)时,代理文本框会获得焦点?!为什么,我不知道?
这非常令人讨厌,因为每次按下“订阅”按钮时,屏幕上的键盘都会出现并覆盖输出窗口,要删除它,用户需要按下UI上的其他位置,再次对文本框进行散焦。
似乎引入 await Task.Run(()=&gt; ... 是导致这种情况的原因。如果我同步调用MqttClient.Connect,那么TextBox不会得到焦点。< / p>
任何建议都将受到高度赞赏。