也许这个功能已经隐藏在 .NET-Framework 的某个地方,但我找不到它。我需要按给定的顺序一个接一个地执行方法。这些方法应该返回一些东西(例如对象),因此有一种方法可以对返回的数据做出反应(例如,由于发生错误而取消以下方法的执行)。方法的执行应该在它自己的线程中运行,我应该能够随时将方法添加到队列中。知道如何在 c# 中实现它吗?
感谢 Jon 的评论,我尝试自己实现这样的队列。这可能是完全错误的 - 所以非常欢迎评论;-)
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
namespace FunctionQueue
{
public class ErrorResult
{
public string ErrorMessage { get; set; }
public bool CancelQueue { get; set; }
}
public class FunctionQueue
{
private readonly ConcurrentQueue<Func<object>> Queue;
private bool isExecuting;
private bool isCanceled;
private readonly Action<ErrorResult> onError;
private readonly Action onComplete;
public FunctionQueue(Action<ErrorResult> onError = null, Action onComplete = null)
{
this.Queue = new ConcurrentQueue<Func<object>>();
this.onError = onError;
this.onComplete = onComplete;
}
public void AddFunctionToQueue( Func<object> functionToAdd, bool startQueue = false )
{
this.Queue.Enqueue(functionToAdd);
if (startQueue && !this.isExecuting) this.ProcessQueue();
}
public void ProcessQueue()
{
if( this.Queue.Count > 0 )
{
Task.Run( () =>
{
this.isCanceled = false;
this.isExecuting = true;
Func<object> functionToExecuteNext;
while( !isCanceled && this.Queue.TryDequeue( out functionToExecuteNext ) )
{
object result = functionToExecuteNext();
ErrorResult errorResult = result as ErrorResult;
if( errorResult != null )
{
if( this.onError != null ) this.onError( errorResult );
if( errorResult.CancelQueue ) this.isCanceled = true;
}
}
} );
}
this.isExecuting = false;
if( this.onComplete != null ) this.onComplete();
}
}
}
我想添加另一个功能,但不幸的是我不知道如何实现:我想为每个添加的函数添加一个可选回调。当此给定函数完成时,应调用该回调。如何添加此功能?