使用后台工作程序的fifo队列,并使用方法(参数)

时间:2015-10-22 23:24:06

标签: c# multithreading task backgroundworker

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

我基本上需要将以下行存储为Action。

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();}

这些是我正在使用的2个类:

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;
        }
    }
}}  

所以我应该使用&#34;行动&#34;或者有更好的方法来做我正在尝试的事情吗?

PS:老实说,我不知道上面做了什么。我所知道的是,当我运行我的程序并单击按钮时,一切都会锁定大约30秒。我试图阻止这种情况发生,但我不知道从哪里开始。我是否正确使用上述任何代码?

编辑:发现当Something被添加到后台队列时,它立即开始工作,所以我不需要后台工作人员。我将不得不更多地了解任务。

1 个答案:

答案 0 :(得分:0)

我最终使用了一种解决方法并摆脱了BackgroundWorker。 没有理解任务或动作,现在我对语法了解得更多,后台工作者完全没用。正确的语法 queue = new BackgroundQueue(); queue.queuetask(() => {code to run};);

我没有意识到方法在传递给QueueTask()的那一刻就开始运行 对于这个问题感到非常愚蠢