好吧,我一直在努力解决这个问题,但我一直无法找到解决方案。 我正在开发你在超市里看到的那些收银应用程序,其中一切工作都很快。收银员知道程序非常好,他们只需按照光速打字,因此用户界面必须非常敏感。
无论如何,因为我只使用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
。没有。无论我做什么来开始某种背景工作,这种方法都需要永远。
我需要检查远程服务器上的用户名和密码,如何在不损害用户界面的情况下完成它?
答案 0 :(得分:4)
您应该关闭IntelliTrace(How-To
)。
答案 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
}