Freeze WPF UI - многопоточность в классе модели представления - PullRequest
0 голосов
/ 20 сентября 2011

Привет! Я использую WPF с Caliburn Micro, и в классе модели View мне нужно тестовое соединение с базой данных 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 все еще зависает. Я не знаю почему, потому что я вызываю этот метод в новом потоке, а не в потоке пользовательского интерфейса.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2011

Попробуйте установить для прокси нулевое значение, чтобы автоматическое обнаружение по умолчанию было отключено.

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

0 голосов
/ 20 сентября 2011

В вашем if вы сразу же вызываете Result.Это заставляет вызывающий поток ждать задачи блокирующим образом.

Вы должны работать, например, с ContinueWith на Task.Это будет вызвано, как только закончится выполнение первой задачи.Осторожнее с SynchronizationContext, хотя!

Кроме того, вы не должны вызывать TaskFactory и т. Д. В другом потоке.Весь смысл Задачи состоит в том, чтобы абстрагировать параллелизм от использования «низкоуровневых» потоков.

...