冻结 WPF UI - 视图模型类中的多线程
您好,我将 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 线程中调用这个方法。
Hi I use WPF with Caliburn Micro and in view model class I need test connection to SQL database.
Here is method which I use for testing connection.
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;
}
}
And I call this method in another thread
//IP is worng
if (Task<bool>.Factory.StartNew(()=>CheckSqlServer("10.10.10.20",1521)).Result)
{
Insert();
}
Problem is that UI of WPF still freeze I dont know why because I call this method in new thread not in UI thread.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在
if
中,您立即调用 Result。这使得调用线程以阻塞方式等待任务。您应该在
Task
上使用ContinueWith
等。第一个任务执行完成后将调用该函数。但要小心 SynchronizationContext!另外,您不应该在另一个线程中调用 TaskFactory 等。 Task 的全部要点是从使用“低级”线程中抽象出并行性。
In your
if
you call Result straight away. That makes the calling thread wait on the task in a blocking way.You should work e.g. with
ContinueWith
on theTask
. That will be called once the execution of the first task finished. Careful with SynchronizationContext, though!Also, you shouldn't call TaskFactory etc. in another thread. The whole point of Task is to abstract parallelism away from using the 'low-level' threads.
尝试将代理设置为空,以便禁用默认的自动发现。
http://msdn.microsoft.com/en-us /library/system.net.httpwebrequest.proxy.aspx
Try to set the proxy to null, so that the default auto-discovery will be disabled.
http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.proxy.aspx