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