标签: backgroundworker

使用delayed_job进行轮询

我有一个过程,通常需要几秒钟才能完成,因此我尝试使用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

33
推荐指数
4
解决办法
1万
查看次数

BackgroundWorker的替代方案,它接受多个参数?

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)

是否有另一个对象或模式允许我们很好地传递多个参数,或者理想情况下,编写我们自己的签名?

.net c# multithreading asynchronous backgroundworker

32
推荐指数
2
解决办法
2万
查看次数

在定时器的回调方法中抛出异常

我无法在任何地方找到这个问题的答案......

System.Threading.Timer的回调方法(或在System.Timers.Timer的事件处理程序中)抛出的异常会发生什么.异常是否传播到创建计时器的线程或异常丢失?

在计时器的回调函数中抛出异常有什么副作用?

什么是向计时器的创建线程发信号通知工作线程(回调方法)中的异常被抛出的正确方法?

谢谢你的时间.

c# multithreading exception timer backgroundworker

32
推荐指数
1
解决办法
1万
查看次数

C#:我是否需要处理在运行时创建的BackgroundWorker?

我通常在表单上有这样的代码:

    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方法调用它更正确吗?

c# dispose backgroundworker

32
推荐指数
4
解决办法
2万
查看次数

"此BackgroundWorker表示它不会报告进度." - 为什么?

我是这个背景工作者的新手
我已经阅读了一些关于如何创建一个
这就是它产生的文章

    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)

c# backgroundworker

32
推荐指数
1
解决办法
3万
查看次数

WPF BackgroundWorker与Dispatcher

在我的WPF应用程序中,我需要执行异步操作,然后我需要更新GUI.这件事我不得不在不同的时刻做不同的操作.我知道两种方法:Dispatcher和BackgroundWorker.

因为当我选择它时我会很难回去,我问你:什么更好?选择一个而不是另一个的原因是什么?

谢谢!Pileggi

wpf multithreading dispatcher backgroundworker

31
推荐指数
2
解决办法
2万
查看次数

如何在匿名方法中产生回报?

基本上我有一个匿名的方法,我用于我的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方法在静态方法中,以防对解决方案很重要.

.net c# anonymous-methods backgroundworker yield-return

31
推荐指数
4
解决办法
1万
查看次数

C# 工作者服务与 Windows 服务

worker服务项目模板windows服务项目模板有什么大的区别,哪个更好用?

我什么时候可以使用工人服务和 Windows 服务?

c# windows-services backgroundworker service-worker

28
推荐指数
1
解决办法
1万
查看次数

BackgroundWorker用匿名方法?

我将使用匿名方法创建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

你能指导我,我怎么做?谢谢.

.net c# anonymous-methods backgroundworker

27
推荐指数
2
解决办法
2万
查看次数

如何取消长时间运行的数据库操作?

目前正在与Oracle合作,但也需要一个MS SQL解决方案.

我有一个GUI,允许用户生成将在数据库上执行的SQL.这可能需要很长时间,具体取决于它们生成的搜索.我希望GUI/App在此搜索期间能够响应,我希望用户能够取消搜索.

我正在使用后台工作线程.

我的问题是,当用户取消搜索时,我无法中断对数据库的调用.它等待它完成然后,它可以轮询'CancelationPending'属性.这不仅浪费了数据库上的资源,而且还为我的代码带来了问题.

如果用户在非常长的查询中点击"搜索",则再次点击"取消",然后再次"搜索" - 第一次搜索仍然在数据库上进行搜索.后台工作人员再次点击搜索时仍然很忙.我遇到这个问题的唯一方法就是建立一个新的后台工作者.

这似乎是一种非常丑陋的做事方式.数据库继续工作我正在创建后台工作者的新实例....当我真的想要停止数据库调用并重新使用同一个worker时.

我怎样才能做到这一点?

.net database oracle asynchronous backgroundworker

26
推荐指数
4
解决办法
2万
查看次数