新建WinFrom项目,在界面上添加两个按钮
分别用Thread和Task实现进度条效果
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//普通Thread实现进度条
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("主线程开始");
new Thread(DoProcessing).Start(); //没有使用线程池,每次调用都开启新线程
//ThreadPool.QueueUserWorkItem(DoProcessing);//使用线程池,重复开启的时候回去线程池拿空闲的线程
Console.WriteLine("主线程结束");
}
//在方法上加上 async
private async void button2_Click(object sender, EventArgs e)
{
await UpdateUi2();
//async.await的语法糖为我们带来了更好的异步编程体验
}
#region Thread
void UpdateUi(int percent)
{
//UI操作
button1.Text = string.Format("{0}%", percent);
}
void DoProcessing(object obj)
{
for (int i = 0; i <= 5; ++i)
{
Thread.Sleep(500);
Console.WriteLine("---------- " + i);
Action<int> updateUi = new Action<int>(UpdateUi);
this.Invoke(updateUi, i);
}
}
#endregion
#region task,async,await
private static int _percent = 0;
int DoProcessing2()
{
Console.WriteLine("Thread id in DoProcessing: {0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(500);
return ++_percent;
}
async Task UpdateUi2()
{
_percent = 0;
button1.Text = string.Format("{0}%", 0);
while (_percent < 5)
{
//await起到释放主线程的作用
int percent = await Task.Run(() => DoProcessing2());
//在子线程处理完成后,又请求主线程继续下面的代码,下面的代码相当于Thread的回调
button2.Text = string.Format("{0}%", percent);
}
}
#endregion
#region 参考
private void button3_Click(object sender, EventArgs e)
{
Thread.Sleep(3000); //堵塞主线程
button1.Text = string.Format("99%");
}
#endregion
}
}
分享到:
相关推荐
在Windows Forms(WinForm)应用开发中,当执行耗时的操作如文件读写、网络通信或大数据处理时,为了提供良好的用户体验,通常会使用进度条控件(ProgressBar)来显示任务的进度。然而,直接在主线程上更新进度条...
在Windows Forms(WinForm)应用开发中,"winform异步进度条LongTime"这个话题主要涉及如何在长时间运行的任务中使用异步编程和进度条控件来提供用户体验的优化。进度条通常用来向用户显示任务执行的进度,特别是在...
通过以上步骤,你可以在WinForm应用中实现一个用委托更新的长条形进度条。这种方法可以很好地适应各种复杂的进度跟踪需求,同时保持界面的响应性和用户体验。记得在实际项目中根据需求调整代码,例如添加取消操作、...
在C#编程中,进度条、代理、多线程...总之,理解并熟练掌握C#中的进度条、代理、多线程和Task对于编写高效、用户友好的应用程序至关重要。在实际开发中,合理运用这些技术可以提高程序的运行效率,同时提升用户体验。
在C# WinForm应用开发中,`ProgressBar`控件是一个常用元素,用于向用户展示某个操作的进度。...在实际开发中,根据项目需求,还可以考虑使用其他异步技术,如`async/await`、`Task`等,并进行性能优化。
本知识点将探讨如何在Winform应用中使用C#实现委托、进度条赋值以及线程安全的操作,这些都是创建高效、用户友好型程序的关键元素。 1. **委托(Delegate)**: 委托在C#中是一种类型,它代表一个方法的引用。它可以...
除了上述的基本使用和自定义,C#还支持更高级的进度条功能,如指示不确定的进度(Indeterminate Mode),在等待未知时间的操作时显示滚动效果。这只需将`ProgressBar`的`IsIndeterminate`属性设置为`true`即可。 ...
文件名"多线程进度条简单实例.sln"和"多线程进度条简单实例"可能是这个示例项目的解决方案文件和源代码文件,里面包含了具体的实现细节,如线程的创建、委托的定义、`BeginInvoke`的使用以及界面设计等。 总之,这...
本主题主要关注如何利用`Task`类来实现多线程并行控制,并且具备暂停、继续和停止任务的能力。`Task`是.NET Framework中的异步编程模型,它提供了对并发执行任务的强大支持。 首先,`Task`类是System.Threading....
9. **C#多线程进度条的实例**和`winform进度条`:这两个示例可能直接展示了如何在WinForm应用中实现多线程更新进度条,可能是通过委托、事件或者异步方法。 学习这些源代码,开发者不仅可以掌握如何在C# WinForm...
在Windows Forms(WinForms)应用开发中,进度条控件(ProgressBar)和应用程序假死(Application Freezing)处理是常见的需求。本示例主要探讨如何有效地利用进度条提供用户反馈,以及如何避免长时间操作导致的界面...
本文将深入探讨如何在WinForm应用程序中实现多线程登录功能,同时结合进度条和图片旋转效果,为用户提供更好的交互体验。 首先,让我们理解多线程的概念。在单线程程序中,所有操作都在同一个线程上执行,这可能...
在.NET Framework中,可以使用`System.Threading`命名空间下的类,如`Thread`、`ThreadPool`或`Task`,来创建和管理线程。 3. **跨线程访问控件**:由于.NET Framework的安全机制,直接从非UI线程修改UI控件是不...
在.NET 4.0中,可以使用BackgroundWorker组件来实现异步操作。BackgroundWorker组件提供了一个事件驱动的模型,可以在后台执行操作,并在完成时通知主线程。以下是如何使用BackgroundWorker的步骤: 1. **添加...
本篇将详细介绍如何在WinForm应用中实现多线程下载,并结合进度条来显示下载进度。 首先,我们要了解C#中的线程概念。在.NET框架中,`System.Threading`命名空间提供了对线程操作的支持。`Thread`类是用于创建和...
在.NET Framework中,多线程可以借助System.Threading命名空间的Thread类,或者在.NET Core和.NET 5及更高版本中使用System.Threading.Tasks命名空间的Task类。多线程可以显著提高下载速度,因为它允许同时处理多个...
本文将深入探讨如何在C#环境下利用WinForm实现窗体加载时数字的动态显示,并额外开启进程以提高效率。 首先,我们需要了解WinForm的基本概念。Windows Forms是.NET Framework提供的一种用于构建桌面应用程序的用户...
在C#中,我们可以使用`System.Threading`命名空间中的`Thread`类或者`Task`类来创建和管理线程。在这个特定的场景下,每个线程负责下载文件的一部分,以分担下载任务,提高整体下载速度。 Winform是.NET Framework...
在.NET框架中,WinForm应用程序通常在...总之,理解和正确使用多线程对于优化C# WinForm应用的性能和用户体验至关重要。通过合理的线程管理和数据交互策略,我们可以避免UI卡顿,提高应用程序的响应性和用户满意度。
可以使用`System.Threading.Thread`类或者更高级的`System.Threading.Tasks.Task`类来实现。 3. **显示等待窗体**:在新线程开始执行时,调用等待窗体的`ShowDialog()`方法,这将阻塞父窗体(即调用它的窗体)直到...