Thread Starts滞后于UI WPF

时间:2013-11-17 19:03:23

标签: c# .net wpf multithreading

好吧,我一直在努力解决这个问题,但我一直无法找到解决方案。 我正在开发你在超市里看到的那些收银应用程序,其中一切工作都很快。收银员知道程序非常好,他们只需按照光速打字,因此用户界面必须非常敏感。

无论如何,因为我只使用WPF进行编码,所以如果有人说WinForms更快,我肯定会学到它。 这是我的代码,它非常简单,因为我正在测试性能

public partial class MainWindow : Window
{
    Thread t;
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {

        t = new Thread(HandleThread);
        t.Start();
    }

    private void HandleThread()
    {
        Thread.Sleep(3000);
    }
}

每当单击该按钮时,我计划在新线程中连接到服务器时启动新线程。 我的问题是方法button_Click非常慢。返回需要大约1秒钟,因此按钮看起来像是卡住了,应用程序看起来很迟钝。我尝试过线程BackgroundWorker,将框架更改为4.0并尝试Tasks。没有。无论我做什么来开始某种背景工作,这种方法都需要永远。

我需要检查远程服务器上的用户名和密码,如何在不损害用户界面的情况下完成它?

2 个答案:

答案 0 :(得分:4)

您应该关闭IntelliTrace(How-To)。

  1. 在“工具”菜单上,单击“选项”。
  2. 在“选项”对话框中,展开“IntelliTrace”节点,然后单击“常规”。
  3. 清除“启用IntelliTrace”复选框。
  4. 单击“确定”。

答案 1 :(得分:1)

每次单击按钮时是否需要生成新线程?这个线程是长寿吗?每次单击此按钮时,您真的想为此分配1兆的堆栈空间(在64位操作系统上)吗?真的确定你不想使用TPL的Task和CancellationTokenSource吗?

在你的情况下,你每次点击都不应该创建一个线程,你想要的是启动一个长时间运行的异步任务并检查结果。

public void OnClick(object src,EventArgs args)
{
    var login = tbLogin.Text;// assuming non MVVM coding here
    var pwd= tbPass.Text;
    Task.Factory.StartNew(()=>{
        return _myWebService.CheckAuth(login,pwd); // your login stuff here
    }).ContinueWith(wsTask=>{
       if(!wsTask.IsCompleted){ // handle errors / cancel }
       DisplayLoginState(ws.Result);
    }, TaskScheduler.FromCurrentSynchronizationContext()); // this runs on the UI Thread

}