目前我正在尝试创建一个可以遍历某些类函数的后台工作器,我创建了一个类来存储一些全局使用的对象(用户设置和其他一些东西)。
我基本上需要将以下行存储为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被添加到后台队列时,它立即开始工作,所以我不需要后台工作人员。我将不得不更多地了解任务。
答案 0 :(得分:0)
我最终使用了一种解决方法并摆脱了BackgroundWorker。
没有理解任务或动作,现在我对语法了解得更多,后台工作者完全没用。正确的语法
queue = new BackgroundQueue();
queue.queuetask(() => {code to run};);
我没有意识到方法在传递给QueueTask()的那一刻就开始运行 对于这个问题感到非常愚蠢