Thread Starts滞后于UI WPF

问题描述 投票:1回答:2

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

无论如何,因为我只在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。没有。无论我做什么来开始某种背景工作,这种方法都需要永远。

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

c# .net wpf multithreading
2个回答
4
投票

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

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

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

}
© www.soinside.com 2019 - 2024. All rights reserved.