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
。