C# 方法使用具有后台工作程序的fifo队列,并使用方法(参数)填充队列

C# 方法使用具有后台工作程序的fifo队列,并使用方法(参数)填充队列,c#,multithreading,task,backgroundworker,C#,Multithreading,Task,Backgroundworker,目前我正在尝试创建一个后台工作程序,它可以循环使用一些类函数,我创建了一个类来存储一些全局使用的对象(用户设置和其他一些东西) 我基本上需要将以下行存储为一个操作 GV_Acc.load_page("weburl", 0); 以下是我正在使用的大部分代码 包含按钮的表单: private void btn_initialize_Click(object sender, EventArgs e){ CusWorker worker = new CusWorker(); worke

目前我正在尝试创建一个后台工作程序,它可以循环使用一些类函数,我创建了一个类来存储一些全局使用的对象(用户设置和其他一些东西)

我基本上需要将以下行存储为一个操作

GV_Acc.load_page("weburl", 0);
以下是我正在使用的大部分代码
包含按钮的表单:

private void btn_initialize_Click(object sender, EventArgs e){
    CusWorker worker = new CusWorker();
    worker.addwork(GV_Acc.load_page("weburl", 0));
    worker.addwork(GV_Acc.json_populate(0));
    worker.asyncworker.RunWorkerAsync();}
以下是我正在使用的两个类:

public class CusWorker
{
    public BackgroundQueue asyncqueue { get;private set; }
    private int tasks;
    public System.ComponentModel.BackgroundWorker asyncworker = new System.ComponentModel.BackgroundWorker();
    public CusWorker()
    {
        asyncqueue = new BackgroundQueue();
        asyncworker.DoWork += new System.ComponentModel.DoWorkEventHandler(asyncworker_DoWork);
        asyncworker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(asyncworker_RunWorkerCompleted);
    }
    public void addwork(Action action)
    {
        asyncqueue.QueueTask(action);
    }
    private void asyncworker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
    {
    }

    private void asyncworker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        if (asyncqueue != null)
        {
            asyncworker.RunWorkerAsync();
        }
    }
}

public class BackgroundQueue
{
    private Task previousTask = Task.FromResult(true);
    private object key = new object();
    public Task QueueTask(Action action)
    {
        lock (key)
        {
            previousTask = previousTask.ContinueWith(t => action()
                , CancellationToken.None
                , TaskContinuationOptions.None
                , TaskScheduler.Default);
            return previousTask;
        }
    }
    public Task<T> QueueTask<T>(Func<T> work)
    {
        lock (key)
        {
            var task = previousTask.ContinueWith(t => work()
                , CancellationToken.None
                , TaskContinuationOptions.None
                , TaskScheduler.Default);
            previousTask = task;
            return task;
        }
    }
}}  
公共类
{
公共背景队列异步队列{get;private set;}
私人智力任务;
public System.ComponentModel.BackgroundWorker asyncworker=新系统.ComponentModel.BackgroundWorker();
公职人员()
{
asyncqueue=新的背景队列();
asyncworker.DoWork+=新系统.ComponentModel.DoWorkEventHandler(asyncworker\u DoWork);
asyncworker.RunWorkerCompleted+=新系统.ComponentModel.RunWorkerCompletedEventHandler(asyncworker\u RunWorkerCompleted);
}
公共工程(行动)
{
asyncqueue.QueueTask(操作);
}
私有void asyncworker\u RunWorkerCompleted(对象发送方,System.ComponentModel.RunWorkerCompletedEventArgs e)
{
}
私有void asyncworker_DoWork(对象发送方,System.ComponentModel.DoWorkEventArgs e)
{
if(异步队列!=null)
{
asyncworker.RunWorkerAsync();
}
}
}
公共类背景队列
{
private Task previousTask=Task.FromResult(true);
私有对象密钥=新对象();
公用任务队列任务(操作操作)
{
锁(钥匙)
{
previousTask=previousTask.ContinueWith(t=>action()
,CancellationToken。无
,TaskContinuationOptions。无
,TaskScheduler.Default);
返回以前的任务;
}
}
公共任务队列任务(函数工作)
{
锁(钥匙)
{
var task=previousTask.ContinueWith(t=>work()
,CancellationToken。无
,TaskContinuationOptions。无
,TaskScheduler.Default);
上一个任务=任务;
返回任务;
}
}
}}  
那么,我应该使用“行动”还是有更好的方法来做我正在尝试的事情

PS:老实说,我现在不知道上面的内容是什么。我所知道的是,当我运行程序并单击按钮时,所有东西都会锁定30秒左右。我正试图阻止这种情况发生,但我不知道从哪里开始。我是否正确使用了上述代码


编辑:发现当一些东西被添加到后台队列时,它会立即开始工作,所以我不需要后台工作人员。我必须学习更多关于任务的知识

我最终使用了一种变通方法,并摆脱了后台工作人员。 我不理解任务或操作,现在我对语法有了更多的了解,后台工作人员是完全无用的。正确的语法

队列=新的背景队列();
queue.queuetask(()=>{code to run};)

我没有意识到该方法在传递给QueueTask()时就开始运行。

对这个问题感到很愚蠢

使用TPL Dataflow的
ActionBlock