冻结WPF UI - 视图模型类中的多线程

时间:2011-09-20 15:25:37

标签: wpf multithreading caliburn.micro freeze

您好我在Caliburn Micro中使用WPF,在视图模型类中我需要测试连接到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线程中。

2 个答案:

答案 0 :(得分:0)

if中,您可以立即致电结果。这使得调用线程以阻塞方式等待任务。

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

此外,您不应该在另一个线程中调用TaskFactory等。任务的重点是从使用“低级”线程中抽象并行性。

答案 1 :(得分:0)

尝试将代理设置为null,以便禁用默认自动发现。

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