111,098
社区成员




Button_print.Click += (X, Y) =>
{
(X as Button).Enabled = false;
Task.Run(async()=> {
//非常耗时的打印时间
});
(X as Button).Enabled = true;
};
Button_print.Click += (X, Y) =>
{
Button_print.Enabled = false;
Task.Run(async()=> {
//非常耗时的打印时间
Button_print.BeginInvoke((Action)delegate{
Button_print.Enabled = true;
});
});
};
实际上,你那个写到 Task.Run(....) 外边的所谓 Enable= true 的思路是完全错误的“异步”思路。有的人说“我异步干一件事,而我傻等这件事儿完成之后才.......”这其实就是幼稚地没学过事件驱动、异步设计概念的结果。
异步编程就是是先注册回调委托,然后在异步的那个动做完成之后自动执行。而不是什么“死循环、傻等”。
button1.Click += (X, Y) =>
{
(X as Button).Enabled = false;
Task.Run(new Action(()=>
{
myPrintTask();
myPrintTaskDone(X);
}));
};
private void myPrintTask()
{
Thread.Sleep(2000);
}
private void myPrintTaskDone(object sender)
{
(sender as Button).Invoke(new Action(() =>{
(sender as Button).Enabled = true;
}) );
}
Button_print.Click += async(X, Y) =>
{
(X as Button).Enabled = false;
await Task.Run(()=> {
//非常耗时的打印时间
Thread.Sleep(5000);
});
(X as Button).Enabled = true;
};