【问题标题】:Freeze WPF UI - multi-threading in view model class冻结 WPF UI - 视图模型类中的多线程
【发布时间】:2011-09-20 15:25:36
【问题描述】:

您好,我将 WPF 与 Caliburn Micro 一起使用,在视图模型类中,我需要测试与 SQL 数据库的连接。

这是我用来测试连接的方法。

    public bool CheckSqlServer(string sqlHost, int sqlPort)
    {
        try
        {
            IPHostEntry ipHost = Dns.Resolve(sqlHost);
            IPAddress ipAddr = ipHost.AddressList[0];

            var tcpCli = new TcpClient();
            tcpCli.Connect(ipAddr, sqlPort);
            tcpCli.Close();

            return true;
        }
        catch
        {
            return false;
        }
    }

我在另一个线程中调用这个方法

         //IP is worng
        if (Task<bool>.Factory.StartNew(()=>CheckSqlServer("10.10.10.20",1521)).Result)
        {
            Insert();
        }

问题是WPF的UI仍然冻结我不知道为什么,因为我在新线程中而不是在UI线程中调用了这个方法。

【问题讨论】:

    标签: wpf multithreading caliburn.micro freeze


    【解决方案1】:

    在您的if 中,您会立即调用 Result。这使得调用线程以阻塞方式等待任务。

    你应该工作,例如在Task 上使用ContinueWith。一旦第一个任务的执行完成,就会调用它。不过要小心 SynchronizationContext!

    另外,您不应该在另一个线程中调用 TaskFactory 等。 Task 的全部意义在于将并行性从使用“低级”线程中抽象出来。

    【讨论】:

      【解决方案2】:

      尝试将代理设置为空,这样默认的自动发现将被禁用。

      http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.proxy.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-16
        • 1970-01-01
        • 2011-06-22
        • 2021-12-21
        • 1970-01-01
        • 2013-10-22
        相关资源
        最近更新 更多