例如功能 有 20 个用户,他们几乎一次点击了发送按钮,所以方法堆叠在队列中,第一个用户消息被发送并收到响应,在第二个第三个之后,依此类推。用户不会与其他人聊天,但使用响应非常快的设备
所以我试图将发送消息的任务排队。
我找到了使用任务队列的代码示例,如示例 1和示例 2 所示。
示例 1
public class SerialQueue
{
readonly object _locker = new object();
WeakReference<Task> _lastTask;
public Task Enqueue(Action action)
{
return Enqueue<object>(() => {
action();
return null;
});
}
public Task<T> Enqueue<T>(Func<T> function)
{
lock (_locker)
{
Task lastTask = null;
Task<T> resultTask = null;
if (_lastTask != null && _lastTask.TryGetTarget(out lastTask))
{
resultTask = lastTask.ContinueWith(_ => function());
}
else
{
resultTask = Task.Run(function);
}
_lastTask = new WeakReference<Task>(resultTask);
return resultTask;
}
}
}
示例 2
public class TaskQueue
{
private readonly SemaphoreSlim _semaphoreSlim;
public TaskQueue()
{
_semaphoreSlim = new SemaphoreSlim(1);
}
public async Task<T> Enqueue<T>(Func<Task<T>> taskGenerator)
{
await _semaphoreSlim.WaitAsync();
try
{
return await taskGenerator();
}
finally
{
_semaphoreSlim.Release();
}
}
public async Task Enqueue(Func<Task> taskGenerator)
{
await _semaphoreSlim.WaitAsync();
try
{
await taskGenerator();
}
finally
{
_semaphoreSlim.Release();
}
}
}
问题是,当我每次按下按钮时传递我想要排队的任务(示例 3)时,任务仍然同时执行并相互中断。
我如何解决问题并将任务堆叠到每次单击时排队?
DIEA
相关分类