首页 > 其他分享 >WinForm UI假死的解决方法

WinForm UI假死的解决方法

时间:2024-03-01 19:22:05浏览次数:31  
标签:Task sender void object 假死 private UI backgroundWorker1 WinForm

方法一:async + await + Task
// 开始

private async void btnStart_Click(object sender, EventArgs e)

{

string message = await GetMessage();

MessageBox.Show(message);

}

// 一个耗时任务

private async Task<string> GetMessage()

{

return await Task<string>.Run(() =>

{

Thread.Sleep(10000);

return "Hello World";

});

}

方法二:使用BackgroundWorker组件
public Form1()

{

InitializeComponent();

this.backgroundWorker1.WorkerReportsProgress = true;

this.backgroundWorker1.WorkerSupportsCancellation = true;

this.backgroundWorker1.DoWork += DoWork;

this.backgroundWorker1.ProgressChanged += ProgressChanged;

this.backgroundWorker1.RunWorkerCompleted += RunWorkerCompleted;

}

// 开始

private void btnStart_Click(object sender, EventArgs e)

{

if (backgroundWorker1.IsBusy)

{

return;

}

backgroundWorker1.RunWorkerAsync();

}

// DoWork

private void DoWork(object sender, DoWorkEventArgs e)

{

int max = pgbStatus.Maximum;

for (int i = 1; i <= max; i++)

{

backgroundWorker1.ReportProgress(i);

Thread.Sleep(1000);

}

}

// ProgressChanged

private void ProgressChanged(object sender, ProgressChangedEventArgs e)

{

pgbStatus.Value = e.ProgressPercentage;

}

// RunWorkerCompleted

private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

MessageBox.Show("完成");

}

方法三:Task + 委托(回调函数)
// 开始

private void btnStart_Click(object sender, EventArgs e)

{

Task task = Task.Run(() =>

{

int max = progressBar1.Maximum;

for (int i = 1; i <= max; i++)

{

UpdateValue(i);

Thread.Sleep(1000);

}

});

}

// 处理线程

private void UpdateValue(int num)

{

if (progressBar1.InvokeRequired)

{

progressBar1.Invoke(new Action<int>(UpdateValue), new object[] { num });

}

else

{

progressBar1.Value = num;

}

}
来自:https://www.codenong.com/cs106719464/

标签:Task,sender,void,object,假死,private,UI,backgroundWorker1,WinForm
From: https://www.cnblogs.com/jigeqiu/p/18047774

相关文章

  • 学习unigui【22】unistringGrid的标题栏双击事件
    第一步:在TuniStringGrid的ClientEvents.ExtEvents中定义Ext.grid.Panel的reconfigure事件:functionreconfigure(sender,store,columns,oldStore,oldColumns,eOpts){columns.forEach(function(col){if(col.titleEl){col.titleEl.on('dblcli......
  • 【HarmonyOS】一招教你在竖屏的UIAbility中使用横屏页面
    ​【关键字】鸿蒙应用开发、ArkTS、UIAbility、横屏页面显示 1、写在前面我们在实际的项目开发过程中,可能会遇到这样的需求:在一个手机应用中,A页面是竖屏展示的,点击A页面的某个按钮需要跳转到B页面,但是B页面需要横屏展示,比如查看海报或者表格信息等内容,在HarmonyOS中,在不增加......
  • 界面控件Telerik UI for ASP. NET Core教程 - 如何为网格添加上下文菜单?
    TelerikUIforASP.NETCore是用于跨平台响应式Web和云开发的最完整的UI工具集,拥有超过60个由KendoUI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格,提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。上下文菜单允许开发者为应用程序的最终用户提供额外的......
  • jquery ui和easyui的区别是什么?
    EasyUI是某公司开发的一套对私免费,对公收费的UI库,基于GNU开源协议,不过只有付费了才能买到他们的源代码。是目前枯人接触过最优秀的一款基于jQuery的UI库,整体打包后不到300k,几乎包含所有的常用组件。jqueryui和easyui的区别jqueryui是jQuery插件,是由jQuery官方维护的UI方向的插件;e......
  • C#的Winform程序关于单击和双击的区别 - 开源研究系列文章
          前些天编码的时候有个关于应用程序的托盘图标的鼠标MouseDown里的单击和双击的问题,只是想单击的时候显示主窗体,双击的时候显示操作窗体。但是编码并调试的时候发现Windows的鼠标双击的事件先执行的单击事件然后才执行双击事件,于是就找了度娘,并且在园子的博问里发布......
  • Vue UI组件库系列之概述
    概述UI组件库:提供了一些如输入框、布局、按钮等在网页UI布局中常用的元素,并将这些元素以组件的形式提供给我们。一般会说UI组件库是基于哪个框架【Vue/React/...】的、PC端/移动端什么项目适合用UI组件库,什么项目不适合?【UI组件库的应用场景】不适合【页面中包含很多定制化、......
  • Element UI
    ElementUI完整引入importElementUIfrom'element-ui';//引入所有组件的样式import'element-ui/lib/theme-chalk/index.css';引入所有的组件Vue.use(ElementUI);注:仅用了几个组件,就引入所有组件和所有组件的样式,不合适,导致项目体积特别大按需引入babel-plugin-comp......
  • comfyUI相关
     pipinstall--upgradepippipinstall huggingface-cli gitconfig--globalcredential.helperstorehuggingface-clilogin  huggingface-clidownloadadept/fuyu-8bmodel-00001-of-00002.safetensors--local-dir.huggingface-clidownloadadept/fuyu-8b--......
  • require.js
    require.js的加载使用require.js的第一步,是先去官方网站下载最新版本。下载后,假定把它放在js子目录下面,就可以加载了。<scriptsrc="js/require.js"></script>有人可能会想到,加载这个文件,也可能造成网页失去响应。解决办法有两个,一个是把它放在网页底部加载,另一个是写成下......
  • .net 应用程序 生成Docker映像时 dotnet restore找不到自定义源的包的问题,ContainerBu
    一、问题:我们在.net应用中生成Docker映像时,会出现ContainerBuildAndLaunch任务意外失败的问题。 查看输出窗口发现,是执行dotnetrestore时,找不到包的问题,因为我的这些包是在自己的私有源上二、解决方案:在Dockerfile文件中,在执行dotnetrestore前一行添加nuget私有源就行......