后台专用线程(可接受其他线程请求)
设计理念由一个独立长时间运行的线程独占指定资源如串口、网口连接等对外提供调用请求避免加锁。public class BackgroundWorkThread { private volatile bool _isInitialized false; private ConcurrentQueue(Funcobject, object, object, TaskCompletionSourceobject) _taskQueue new ConcurrentQueue(Funcobject, object, object, TaskCompletionSourceobject)(); public void Initialize() { if (_isInitialized) return; _isInitialized true; var _ Task.Factory.StartNew(() { Debug.WriteLine($BackgroundWorkThread started on thread {Thread.CurrentThread.ManagedThreadId}); while (true) { while (_taskQueue.TryDequeue(out var task)) { try { (Funcobject, object act, object param, TaskCompletionSourceobject tcs) task; var res act(param); tcs.SetResult(res); } catch (Exception ex) { Debug.WriteLine($Error executing task: {ex.Message}); } } Thread.Sleep(10); } }, TaskCreationOptions.LongRunning); } public async Taskobject SendFuncAsync(Funcobject, object func, object param, int timeOutMS -1) { var tcs new TaskCompletionSourceobject(); timeOutMS timeOutMS 0 ? int.MaxValue : timeOutMS; using (CancellationTokenSource cts new CancellationTokenSource(timeOutMS)) { cts.Token.Register(() { if (!tcs.Task.IsCompleted) { tcs.TrySetException(new TimeoutException($operation timeout)); } }); _taskQueue.Enqueue((func, param, tcs)); return await tcs.Task; } } public object SendFunc(Funcobject, object func, object param) { var tcs new TaskCompletionSourceobject(); _taskQueue.Enqueue((func, param, tcs)); return tcs.Task.Result; } }private BackgroundWorkThread _backgroundWorkThread new BackgroundWorkThread(); _backgroundWorkThread.Initialize(); private async void button4_Click(object sender, EventArgs e) { var res await _backgroundWorkThread.SendFuncAsync((param) { Thread.Sleep(800); return Convert.ToInt32(param) 1; }, 500); Debug.WriteLine($ res {res}); }这里范例基础上轻微改造可以实现简化的Actor。也可直接使用线程池来响应请求但都可以无锁解决线程冲突。更轻量高性能异步编程的核心结构体ManualResetValueTaskSourceCore40字节高频请求下放在封装类中使用。