C# 使用ManualResetEvent和CancellationTokenSource以及后台线程,实现后台数据获取和界面刷新功能的启动、继续、暂停和停止功能 给出完整程序
时间: 2024-09-12 08:07:46 浏览: 61
c#,winfrom线程暂停,继续,停止dome
在C#中,可以使用`System.Threading.Tasks.Task`, `System.Threading.CancellationTokenSource`和`System.Threading.ManualResetEvent`来管理后台线程的工作并配合UI操作。这里是一个简化版的例子,展示如何实现启动、继续、暂停和停止的功能:
```csharp
using System;
using System.Threading;
using System.Threading.Tasks;
class BackgroundWorker
{
private CancellationTokenSource _cancellationTokenSource;
private ManualResetEventSlim _stopEvent = new ManualResetEventSlim(initialState: false);
private bool _isRunning;
public async Task Start(string connectionString)
{
_isRunning = true;
try
{
_cancellationTokenSource = new CancellationTokenSource();
using (var connection = new SqlConnection(connectionString))
{
await Task.Run(() => FetchDataAsync(connection.Token), _cancellationTokenSource.Token);
}
}
catch (OperationCanceledException) when (_cancellationTokenSource.IsCancellationRequested)
{
Console.WriteLine("Fetch operation was canceled.");
}
finally
{
_isRunning = false;
_stopEvent.Set();
}
}
private async Task FetchDataAsync(CancellationToken cancellationToken)
{
while (_isRunning && !cancellationToken.IsCancellationRequested)
{
// 在这里获取后台数据,如数据库查询
var data = await GetDataFromDatabase(cancellationToken);
// 在UI线程更新数据
if (data != null)
UpdateInterface(data);
}
}
public void Continue()
{
if (!_isRunning)
{
_stopEvent.Reset();
_isRunning = true;
}
}
public void Pause()
{
if (_isRunning)
{
_cancellationTokenSource.Cancel();
}
}
public void Stop()
{
_isRunning = false;
_stopEvent.Wait();
}
// 更新UI的方法,假设我们有一个UI控件需要刷新
private void UpdateInterface(object newData)
{
// UI code to update your control with the new data
}
private async Task<object> GetDataFromDatabase(CancellationToken cancellationToken)
{
// 你的数据库操作...
}
}
// 示例用法:
public class Program
{
public static void Main()
{
BackgroundWorker worker = new BackgroundWorker();
worker.Start("your_connection_string_here");
// 假设用户按下按钮触发操作
buttonContinue.Click += (_, e) => worker.Continue();
buttonPause.Click += (_, e) => worker.Pause();
buttonStop.Click += (_, e) => worker.Stop();
}
}
```
在这个例子中,`Start`方法初始化后台任务,当用户点击“继续”、“暂停”或“停止”按钮时,会相应地调用`Continue`、`Pause`或`Stop`方法。注意,`Pause`会取消令牌,导致`FetchDataAsync`方法不再执行;而`Stop`则会等待所有正在进行的操作完成再退出。
阅读全文