轮胎外观检测添加思谋语义分割模型检测工具
C3204
6 小时以前 dc18021539bdf4ee176ec9d9b88eb7d9ad581600
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace LB_SmartVision
{
    public sealed class PausableHeartbeatAsync : IAsyncDisposable
    {
        private readonly CancellationTokenSource _cts = new();
        private readonly AsyncManualResetEvent _pauseEvent = new(true); // 初始为已设置(未暂停)
        private readonly Task _loopTask;
        private readonly Func<Task> _sendHeartbeatAsync;
        private readonly TimeSpan _interval;
 
        public PausableHeartbeatAsync(Func<Task> sendHeartbeatAsync, TimeSpan interval)
        {
            _sendHeartbeatAsync = sendHeartbeatAsync;
            _interval = interval;
            _loopTask = Task.Run(RunAsync);
        }
 
        private async Task RunAsync()
        {
            using var timer = new PeriodicTimer(_interval);
            try
            {
                while (await timer.WaitForNextTickAsync(_cts.Token))
                {
                    // 等待暂停状态解除(若未暂停则立即通过)
                    await _pauseEvent.WaitAsync(_cts.Token);
 
                    try
                    {
                        await _sendHeartbeatAsync();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"[Async Heartbeat] 异常: {ex.Message}");
                    }
                }
            }
            catch (OperationCanceledException) { }
        }
 
        public void Pause() => _pauseEvent.Reset();
        public void Resume() => _pauseEvent.Set();
        public async Task StopAsync()
        {
            _cts.Cancel();
            Resume(); // 防止 WaitAsync 永久阻塞
            await _loopTask.ConfigureAwait(false);
        }
        public async ValueTask DisposeAsync()
        {
            await StopAsync();
            _cts.Dispose();
        }
 
        // 简单的异步手动重置事件辅助类
        private class AsyncManualResetEvent
        {
            private volatile TaskCompletionSource<bool> _tcs = new();
            private readonly object _lock = new();
 
            public AsyncManualResetEvent(bool initialState)
            {
                if (initialState) _tcs.TrySetResult(true);
            }
 
            public Task WaitAsync(CancellationToken token = default)
            {
                return _tcs.Task.WaitAsync(token);
            }
 
            public void Set()
            {
                lock (_lock)
                {
                    _tcs.TrySetResult(true);
                }
            }
 
            public void Reset()
            {
                lock (_lock)
                {
                    if (_tcs.Task.IsCompleted)
                        _tcs = new TaskCompletionSource<bool>();
                }
            }
        }
    }
}