副作用:使用异步编程的TextBox GotFocus问题

时间:2015-06-05 13:34:26

标签: xaml asynchronous windows-runtime mqtt

我已经创建了一个用于测试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>

任何建议都将受到高度赞赏。

0 个答案:

没有答案