另一种不涉及保持委托或任务完成源的方法是通过lambda表达式
public class WorkerHub {
private readonly ConcurrentQueue<TaskWrapper> _tasks;
private readonly Timer _timer;
public WorkerHub() {
_timer = new Timer();
_tasks = new ConcurrentQueue<TaskWrapper>();
}
public Task<TResult> Post<TResult>(Func<TResult> func) {
var cts = new TaskCompletionSource<TResult>();
Action handler = () => {
cts.SetResult(func());
};
var wrapper = new TaskWrapper { Invoke = handler };
_tasks.Enqueue(wrapper);
return cts.Task;
}
public Task Post(Action action) {
var cts = new TaskCompletionSource<bool>();
Action handler = () => {
action();
cts.SetResult(true);
};
var wrapper = new TaskWrapper { Invoke = handler };
_tasks.Enqueue(wrapper);
return cts.Task;
}
private TaskWrapper Pop()
{
_tasks.TryDequeue(out var wrapper);
return wrapper;
}
public void Start() {
_timer.Enabled = true;
_timer.AutoReset = true;
_timer.Interval = 2500;
_timer.Elapsed += (sender, args) => {
var wrapper = Pop();
if (wrapper != null)
wrapper.Invoke();
};
_timer.Start();
}
public void Stop() {
}
private class TaskWrapper {
public Action Invoke { get; set; }
}
}
Action
委托是为了处理所需的行为而创建的,并在需要时提供给要调用的包装器。
包装器现在变得多余,可以完全删除
public class WorkerHub {
private readonly ConcurrentQueue<Action> _tasks;
private readonly Timer _timer;
public WorkerHub() {
_timer = new Timer();
_tasks = new ConcurrentQueue<Action>();
}
public Task<TResult> Post<TResult>(Func<TResult> func) {
var cts = new TaskCompletionSource<TResult>();
Action handler = () => {
cts.SetResult(func());
};
_tasks.Enqueue(handler);
return cts.Task;
}
public Task Post(Action action) {
var cts = new TaskCompletionSource<bool>();
Action handler = () => {
action();
cts.SetResult(true);
};
_tasks.Enqueue(handler);
return cts.Task;
}
public void Start() {
_timer.Enabled = true;
_timer.AutoReset = true;
_timer.Interval = 2500;
_timer.Elapsed += (sender, args) => {
Action handler = null;
if (_tasks.TryDequeue(out handler) && handler != null)
handler.Invoke();
};
_timer.Start();
}
public void Stop() {
}
}