c#中使用了using自动释放资源,如果在using中被return或者异常终止,也会继续执行dispose函数的

using System;

namespace using释放资源
{
    class Program
    {
        static void Main(string[] args)
        {
            using (A a = new A())
            {
                Console.WriteLine("开始执行。");
                //throw new Exception();
                return;
            }
        }
    }
    class A : IDisposable
    {
        public void Dispose()
        {
            Console.WriteLine("执行了Dispose方法。");
            Console.ReadKey();
        }
    }
}

运行结果:
在这里插入图片描述

C#,`ManualResetEvent` 和 `CancellationTokenSource` 可用于协调后台任务(如数据更新)与UI线程之间的交互,以便控制任务的开始、暂停和停止。以下是一个简化版的例子,展示了如何使用这两个类: ```csharp using System; using System.Threading.Tasks; using System.Windows.Forms.DataVisualization.Charting; // 创建一个手动重置事件 private ManualResetEventSlim updateSignal = new ManualResetEventSlim(initialState: false); // 创建一个取消令牌源 private CancellationTokenSource cancellationTokenSource = null; public partial class MainForm : Form { private BackgroundWorker backgroundWorker; public MainForm() { InitializeComponent(); // 初始化BackgroundWorker backgroundWorker = new BackgroundWorker(); backgroundWorker.WorkerReportsProgress = true; backgroundWorker.WorkerSupportsCancellation = true; backgroundWorker.DoWork += Worker_DoWork; backgroundWorker.ProgressChanged += Worker_ProgressChanged; backgroundWorker.RunWorkerCompleted += Worker_RunWorkerCompleted; } private void buttonStart_Click(object sender, EventArgs e) { // 当按钮点击时,开始任务并设置信号为等待状态 cancellationTokenSource = new CancellationTokenSource(); backgroundWorker.RunWorkerAsync(cancellationTokenSource.Token); updateSignal.Set(); // 设置更新信号,开始更新操作 } private void buttonPause_Click(object sender, EventArgs e) { // 暂停任务 if (backgroundWorker.IsBusy && !cancellationTokenSource.IsCancellationRequested) cancellationTokenSource.Cancel(); updateSignal.Reset(); // 重置更新信号,暂停更新操作 } private void buttonStop_Click(object sender, EventArgs e) { // 停止任务并释放资源 cancellationTokenSource?.Cancel(false); // 如果任务未完成,尝试正常终止 backgroundWorker.Dispose(); updateSignal.Dispose(); } // BackgroundWorker的DoWork事件处理函数 private async void Worker_DoWork(object sender, DoWorkEventArgs e) { try { while (!cancellationTokenSource.IsCancellationRequested) { await Task.Delay(5000, cancellationTokenSource.Token); // 假设这是一个耗时的数据更新操作 // 更新图表数据... chart1.Series["Series1"].Points.AddXY(DateTime.Now, GenerateChartData()); // 示例代码,生成数据并添加到图表 // 提交进度报告,如果设置了WorkReportsProgress属性 if (backgroundWorker.ReportProgress > 0) e.ReportProgress((int)(DateTime.UtcNow - DateTime.Now).TotalMilliseconds / 5000); } } catch (OperationCanceledException) { } } // 进度改变的事件处理函数 private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; } // 工作完成的事件处理函数 private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { // 清理工作完成后,可以重置信号,再次允许更新 updateSignal.Set(); UpdateChart(); // 示例代码,更新图表显示 } // 示例数据生成函数 private double GenerateChartData() { // 实现你自己的数据生成逻辑 return Math.Random.NextDouble() * 100; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值