您现在的位置是:首页 > 编程 > 

C#(blazor实现)中线程的开始、暂停、继续、停止与定时关闭代码实现

2025-07-28 02:47:36
C#(blazor实现)中线程的开始、暂停、继续、停止与定时关闭代码实现 C#中线程的开始与停止使用CancellationTokenSource类,阻塞与非阻塞使用ManualResetEvent类以下为代码实现: TaskTest.razor代码语言:javascript代码运行次数:0运行复制@page "/Task" <div class="main&

C#(blazor实现)中线程的开始、暂停、继续、停止与定时关闭代码实现

C#中线程的开始与停止使用CancellationTokenSource类,阻塞与非阻塞使用ManualResetEvent类

以下为代码实现: TaskTest.razor

代码语言:javascript代码运行次数:0运行复制
@page "/Task"
<div class="main">
    <h1>线程控制</h1>
    <p role="status" style="margin:20px 0;">提示信息: @_message</p>
    <button @onclick="Start" style="margin-right:20px;background:">开始</button>
    <button @onclick="Pause" style="margin-right:20px;">暂停</button>
    <button @onclick="Continue" style="margin-right:20px;">继续</button>
    <button @onclick="Stop" style="margin-right:20px;">停止</button>
    <input type="number" @bind-value="@_milliseconds">
    <button @onclick="Timing" style="margin-right:20px;">定时取消</button>
</div>
<!--
    CancellationTokenSource可以使用CreateLinkedTokenSource对多任务进行管理,实例如下:
        static CancellationTokenSource c1 = new CancellationTokenSource();
        static CancellationTokenSource c2 = new CancellationTokenSource();
        static CancellationTokenSource c = new CancellationTokenSource();
        static CancellationTokenSource compositeCancel = CancellationTokenSource.CreateLinkedTokenSource(c1.Token, c2.Token, c.Token);
    创建线程时将compositeCancel传递过去,当c1\c2\c其中任意一个任务cancel,则所有任务关闭
-->

@code {
    private String _message = "";
    private CancellationTokenSource? _tokenSource;//用来终止线程
    private ManualResetEvent? _manualReset;//用来阻塞/恢复线程运行
    private int _milliseconds = 1000;

    private void Start() {
         if(_tokenSource != null) {
            Pause();
            Thread.Sleep(200);
            _message = "一次只能创建一个线程!请点击继续开启当前线程!";
            StateHasChanged();
            return;
        }
        _tokenSource = new();
        _manualReset = new(true);
        int i = 0;
        Task.Run(() => {
            while (!_tokenSource.Token.IsCancellationRequested) {
                _manualReset.WaitOne(); // 根据是否收到信号判断是否阻塞当前线程
                Thread.Sleep(200);
                _message = $"线程{Environment.CurrentManagedThreadId}正在运行第{++i}次{}";
                InvokeAsync(() => { StateHasChanged(); return Task.CompletedTask; });
            }
            CancelSuccess();
            InvokeAsync(() => { StateHasChanged(); return Task.CompletedTask; });
        }, _tokenSource.Token);
    }
    private void Pause() {
        _manualReset?.Reset(); // 阻塞所有调用WaitOne()的线程
    }
    private void Continue() {
        _manualReset?.Set(); // WaitOne()阻塞的等待线程将恢复并继续执行
    }
    private void Stop() {
        _tokenSource?.Cancel();// 关闭线程
        StateHasChanged();
    }
    private void Timing() {
        _tokenSource?.CancelAfter(_milliseconds);// 定时关闭线程
        //也可以在new对象的时候直接给他一个定时参数eg:new CancellationTokenSource(1000);
    }
    private void CancelSuccess() {
        _tokenSource = null;
        _manualReset = null;
        _message = "线程取消成功!";
    }
}

TaskTest.

代码语言:javascript代码运行次数:0运行复制
.main {
    padding: 20px;
    background: gray;
}
button {
    display: inline-block;
    margin: 0;
    padding: 0 20px;
    height: 40px;
    border: 1px solid #fff;
    border-radius: 4px;
    font-size: 14px;
    color: #fff;
    background: rgba(68, 68, 68, 0.5);
    cursor: pointer;
}
input {
    height: 40px;
    border: none;
    border-radius: 4px;
    font-size: 12px;
    color: #fff;
    text-indent: 1em;
    background: #444;
    outline: none;
}

界面如下图所示:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:202-0-2,如有侵权请联系 cloudcommunity@tencent 删除c#blazorbuttonprivate线程

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1239454.html

相关标签:无
上传时间: 2025-07-26 21:22:59
留言与评论(共有 9 条评论)
本站网友 深圳耳鼻喉医院
4分钟前 发表
20px;">继续</button> <button @onclick="Stop" style="margin-right
本站网友 上海钢材
18分钟前 发表
20px;">继续</button> <button @onclick="Stop" style="margin-right
本站网友 北京大众点评网
23分钟前 发表
_tokenSource.Token); } private void Pause() { _manualReset?.Reset(); // 阻塞所有调用WaitOne()的线程 } private void Continue() { _manualReset?.Set(); // WaitOne()阻塞的等待线程将恢复并继续执行 } private void Stop() { _tokenSource?.Cancel();// 关闭线程 StateHasChanged(); } private void Timing() { _tokenSource?.CancelAfter(_milliseconds);// 定时关闭线程 //也可以在new对象的时候直接给他一个定时参数eg:new CancellationTokenSource(1000); } private void CancelSuccess() { _tokenSource = null; _manualReset = null; _message = "线程取消成功!"; } }TaskTest.代码语言:javascript代码运行次数:0运行复制.main { padding
本站网友 财富密码
9分钟前 发表
">开始</button> <button @onclick="Pause" style="margin-right
本站网友 松下冰箱官网
9分钟前 发表
#444; outline
本站网友 安亭事件
21分钟前 发表
20px;">继续</button> <button @onclick="Stop" style="margin-right
本站网友 计算机论坛
18分钟前 发表
C#(blazor实现)中线程的开始
本站网友 专治各种不服
13分钟前 发表
1px solid #fff; border-radius