我有一个过程,通常需要几秒钟才能完成,因此我尝试使用delayed_job来异步处理它.工作本身运作正常,我的问题是如何轮询工作以确定是否已完成.
我可以通过简单地将它分配给变量来获取delayed_job的id:
job = Available.delay.dosomething(:var => 1234)
+------+----------+----------+------------+------------+-------------+-----------+-----------+-----------+------------+-------------+
| id | priority | attempts | handler | last_error | run_at | locked_at | failed_at | locked_by | created_at | updated_at |
+------+----------+----------+------------+------------+-------------+-----------+-----------+-----------+------------+-------------+
| 4037 | 0 | 0 | --- !ru... | | 2011-04-... | | | | 2011-04... | 2011-04-... |
+------+----------+----------+------------+------------+-------------+-----------+-----------+-----------+------------+-------------+
Run Code Online (Sandbox Code Playgroud)
但是一旦完成作业,它就会删除它,并且搜索完成的记录会返回错误:
@job=Delayed::Job.find(4037)
ActiveRecord::RecordNotFound: Couldn't find Delayed::Backend::ActiveRecord::Job with ID=4037
@job= Delayed::Job.exists?(params[:id])
Run Code Online (Sandbox Code Playgroud)
我是否需要改变这一点,并推迟删除完整的记录?我不知道我怎么能得到它的状态通知.或者正在查看死记录作为完成证明吗?其他人面对类似的事情?
ruby-on-rails backgroundworker push-notification delayed-job ruby-on-rails-3
BackgroundWorker对象允许我们将单个参数传递给DoWorkEventHandler.
// setup/init:
BackgroundWorker endCallWorker = new BackgroundWorker();
endCallWorker.DoWork += new DoWorkEventHandler(EndCallWorker_DoWork);
...
endCallWorker.RunWorkerAsync(userName);
// the handler:
private void EndCallWorker_DoWork(object sender, DoWorkEventArgs e)
{
string userName = e.Argument as string;
...
}
Run Code Online (Sandbox Code Playgroud)
要传递多个参数,我必须将它们包装在一个对象中,就像这个可怜的字符串数组:
// setup/init:
BackgroundWorker startCallWorker = new BackgroundWorker();
startCallWorker.DoWork += new DoWorkEventHandler(StartCallWorker_DoWork);
...
startCallWorker.RunWorkerAsync(new string[]{userName, targetNumber});
// the handler:
private void StartCallWorker_DoWork(object sender, DoWorkEventArgs e)
{
string[] args = e.Argument as string[];
string userName = args[0];
string targetNumber = args[1];
}
Run Code Online (Sandbox Code Playgroud)
是否有另一个对象或模式允许我们很好地传递多个参数,或者理想情况下,编写我们自己的签名?
我无法在任何地方找到这个问题的答案......
System.Threading.Timer的回调方法(或在System.Timers.Timer的事件处理程序中)抛出的异常会发生什么.异常是否传播到创建计时器的线程或异常丢失?
在计时器的回调函数中抛出异常有什么副作用?
什么是向计时器的创建线程发信号通知工作线程(回调方法)中的异常被抛出的正确方法?
谢谢你的时间.
我通常在表单上有这样的代码:
private void PerformLongRunningOperation()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate
{
// perform long running operation here
};
worker.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
这意味着我不会处理它BackgroundWorker,而如果我已经由表单设计者添加它,那么我认为它会被处理掉.
这会导致任何问题吗?声明模块级别_saveWorker,然后Dispose从表单的dispose方法调用它更正确吗?
我是这个背景工作者的新手
我已经阅读了一些关于如何创建一个
这就是它产生的文章
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Bitmap imgbox = new Bitmap(pictureBox.Image);
int imgHeight = imgbox.Height;
int imgWidth = imgbox.Width;
int counter = 1;
MinMaxWidth = imgWidth - 50;
MaxWidth = imgWidth;
try
{
Color c;
//Color c2;
for (int i = 0; i < imgbox.Width; i++)
{
for (int j = 0; j < imgbox.Height; j++)
{
c = imgbox.GetPixel(i, j);
string cn = c.Name;
counter++;
backgroundWorker1.ReportProgress(counter);
}
}
MessageBox.Show("SUCESSFULLY DONE");
}
catch (Exception ex) { …Run Code Online (Sandbox Code Playgroud) 在我的WPF应用程序中,我需要执行异步操作,然后我需要更新GUI.这件事我不得不在不同的时刻做不同的操作.我知道两种方法:Dispatcher和BackgroundWorker.
因为当我选择它时我会很难回去,我问你:什么更好?选择一个而不是另一个的原因是什么?
谢谢!Pileggi
基本上我有一个匿名的方法,我用于我的BackgroundWorker:
worker.DoWork += ( sender, e ) =>
{
foreach ( var effect in GlobalGraph.Effects )
{
// Returns EffectResult
yield return image.Apply (effect);
}
};
Run Code Online (Sandbox Code Playgroud)
当我这样做时,编译器告诉我:
"yield语句不能在匿名方法或lambda表达式中使用"
那么在这种情况下,最优雅的方法是什么?顺便说一句,这个DoWork方法在静态方法中,以防对解决方案很重要.
worker服务项目模板和windows服务项目模板有什么大的区别,哪个更好用?
我什么时候可以使用工人服务和 Windows 服务?
我将使用匿名方法创建BackgroundWorker.
我写了以下代码:
BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(
() =>
{
int i = 0;
foreach (var item in query2)
{
....
....
}
}
);
Run Code Online (Sandbox Code Playgroud)
但是委托'System.ComponentModel.DoWorkEventHandler'不接受'0'参数,我必须将两个对象传递给匿名方法:object sender,DoWorkEventArgs e
你能指导我,我怎么做?谢谢.
目前正在与Oracle合作,但也需要一个MS SQL解决方案.
我有一个GUI,允许用户生成将在数据库上执行的SQL.这可能需要很长时间,具体取决于它们生成的搜索.我希望GUI/App在此搜索期间能够响应,我希望用户能够取消搜索.
我正在使用后台工作线程.
我的问题是,当用户取消搜索时,我无法中断对数据库的调用.它等待它完成然后,它可以轮询'CancelationPending'属性.这不仅浪费了数据库上的资源,而且还为我的代码带来了问题.
如果用户在非常长的查询中点击"搜索",则再次点击"取消",然后再次"搜索" - 第一次搜索仍然在数据库上进行搜索.后台工作人员再次点击搜索时仍然很忙.我遇到这个问题的唯一方法就是建立一个新的后台工作者.
这似乎是一种非常丑陋的做事方式.数据库继续工作我正在创建后台工作者的新实例....当我真的想要停止数据库调用并重新使用同一个worker时.
我怎样才能做到这一点?
backgroundworker ×10
c# ×7
.net ×4
asynchronous ×2
database ×1
delayed-job ×1
dispatcher ×1
dispose ×1
exception ×1
oracle ×1
timer ×1
wpf ×1
yield-return ×1