标签: backgroundworker

.NET 线程池 - WinForms UI 无响应

设想

我有一个 Windows 窗体应用程序。主窗体内部有一个循环,迭代大约 3000 次,在新线程上创建类的新实例来执行一些计算。请记住,此设置使用线程池,当此循环只有大约 100 次迭代(要处理 100 个资产)时,UI 确实保持响应。但一旦这个数字开始大幅增加,UI 就会锁定到 Eggtimer 模式,因此写入表单上列表框的日志将变得不可读。

问题

我是否正确地认为解决此问题的最佳方法是使用后台工作人员?UI 是否锁定,因为即使我使用许多不同的线程(为了速度),UI 本身并不位于其自己的单独线程上?

非常感谢建议的实施。

编辑!!

因此,我们可以说,我决定以 100 个为一组进行批量处理,而不是仅仅发送并排队 3000 个资产进行处理。我将如何有效地做到这一点?我早些时候尝试添加“Thread.Sleep(5000);” 每一批 100 个都被发射之后,但整个事情似乎一团糟......

c# backgroundworker winforms threadpool

2
推荐指数
1
解决办法
3012
查看次数

后台工作人员重用错误 C#

我正在尝试学习如何在我的项目中使用后台工作人员,但我不断收到错误,我只是不知道该怎么做。在设计器中我创建了backgroundWorker1和一个按钮。

private void btnNewSchedule_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw = backgroundWorker1;
        Scheduletest(bw);

    }
private void Scheduletest(BackgroundWorker bw)
    {
     //junk code

     //do the expensive coding part now
        bw.RunWorkerAsync();

    }
Run Code Online (Sandbox Code Playgroud)

当我单击按钮运行工作程序一次时,它工作正常,但第二次单击时,我收到错误“此操作已经调用了OperationCompleted,并且进一步的调用是非法的”

我读到我每次都必须创建一个新的后台工作实例,这就是我尝试对 bw 后台工作人员执行的操作,但我认为该部分不正确。有人可以帮助我重新使用这个按钮吗?

万分感谢

c# backgroundworker windows-forms-designer visual-studio-2012

2
推荐指数
1
解决办法
2651
查看次数

将内存缓存注入 .NET 5 控制台应用程序

我有一个 .NET 5 控制台应用程序,它将在后台工作程序中运行长时间运行的进程。我收到编译错误,建议:

“IServiceCollection”不包含“AddMemoryCache”的定义,并且找不到接受“IServiceCollection”类型的第一个参数的可访问扩展方法“AddMemoryCache”(您是否缺少 using 指令或程序集引用?)

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using MyBot;

using IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {
        services.AddLogging();
        services.AddSingleton<User>();
        services.AddMemoryCache();
        services.AddHostedService<Worker>();
    })
    .Build();

await host.RunAsync();
Run Code Online (Sandbox Code Playgroud)

我想将内存缓存注入到我的 Worker 类中,并打算在我的启动代码中注册它。注意 - 不注册 MemoryCache 会导致运行时出现依赖性解析问题。

许多示例建议可以使用 AddMemoryCache,但是,我的应用程序不是显示大多数示例的 ASP.NET 应用程序。

我的工人阶级是这样的:

public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;
        private User _user;
        private IMemoryCache _cache;

        public Worker(ILogger<Worker> logger, User user, IMemoryCache memoryCache)
        {
            _logger = logger;
            _user = user;
            _cache = memoryCache;
        }
Run Code Online (Sandbox Code Playgroud)

如何将 MemoryCache 对象注入到非 asp.net …

c# console-application backgroundworker .net-5

2
推荐指数
1
解决办法
2860
查看次数

.NET CORE Lifetime 和 DI 注入的后台任务

我想在asp.net core 中使用后台任务。我找到了有用的文档https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-6.0&tabs=visual-studio

我想知道为什么它们的生命周期显然是有范围的激活有范围服务的托管服务。作用域服务可以使用依赖项注入 (DI)。 在这方面的范围是什么?

对于 Web 应用程序,范围生命周期表示每个客户端请求(连接)都会创建一次服务。使用 AddScoped 注册作用域服务。在处理请求的应用程序中,作用域服务将在请求结束时被释放。

虽然我确实理解这对于例如对 API 的标准 http get 请求意味着什么,但我不理解作为后台工作者的含义。恕我直言,拥有一个单身背景工作者会更有意义。我当然不希望在我的应用程序中同时运行多个实例。

另一件事是后台工作人员中的 DI,它显然与标准服务不同: 要在后台服务中使用作用域服务,请创建一个作用域。默认情况下,不会为托管服务创建范围。

我无法确认:

    services.AddHostedService(x => new DataPersister(x.GetRequiredService<IAsyncDocumentSession>(), x.GetRequiredService<ILogger>()));
Run Code Online (Sandbox Code Playgroud)

似乎工作得很好。

backgroundworker asp.net-core

2
推荐指数
1
解决办法
7023
查看次数

后台工人类取消,设置取消待定标志但不退出

我叫obackgroundworker.CancelAsync(); 在一个后台工作者当前在另一个线程中做一些工作然后使用while(obackgroundworker.IsBusy == true)等待它在退出应用程序之前完成(如果用户在线程离开处理时改变主意并且我想要干净地关闭)

取消挂起的单位正确设置为true但线程没有退出,在工作线程中我有:

backgroundworker obackgroundworker = (backgroundworker)sender;
if (obackgroundworker.cancellationpending == true)
     e.cancel = true;              
Run Code Online (Sandbox Code Playgroud)

应检查取消是否待定,然后将取消的标志设置为true,我认为这也会导致线程实际终止...?或者,当检测到取消实际结束时,是否需要从线程调用其他函数?

我已经阅读了很多使用背景工作者的例子,并且没有报告任何问题.

资料来源:

http://www.albahari.com/threading/part3.aspx http://www.dotneat.net/2009/02/10/BackgroundworkerExample.aspx http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads. ASPX

谢谢

c# backgroundworker request-cancelling

1
推荐指数
2
解决办法
4233
查看次数

我如何等待BackgroundWorker的完成?

我想用它BackgroundWorker来从GUI执行数据库事务.

我如何命令BackgroundWorker执行工作然后等待工作人员完成,同时保持GUI响应?

我是否必须DoEvents为此目的使用,还是有另一种方式?

.net wpf backgroundworker winforms

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

当BackgroundWorker中出现问题时,在不同的线程上触发代码?

我有一个运行和查找东西的后台工作程序,当它找到东西时,我想更新我的主WinForm.说我遇到的问题是,当我试图从我的后台工作更新我的WinForm的,我得到告诉我,我不能修改我的后台工作之外所做的(换句话说事情,一切都在我的表单错误).

有人可以提供一个简单的代码示例,说明如何让我的代码以我想要的方式工作吗?谢谢!

c# backgroundworker winforms

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

为什么我不需要为非GUI线程调用某些表单元素?

我有一个BackgroundWorker在非GUI线程上调用函数.我注意到对于某些表单元素,我可以在不进行调用的情况下更新GUI.其他人仍然会导致运行时错误,因为程序试图以非线程安全的方式更新GUI.

这是为什么?

c# backgroundworker

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

抽象的模式注意到涉及BackgroundWorker

在我的课程中,我注意到下面的模式.我怎么能把它抽象出来呢?有什么建议?

private void InitializeClass()
{
    BackgroundWorker bgw1 = new BackgroundWorker();
    bgw1.DoWork += (s,e) =>
    {
        // doing work
    };

    BackgroundWorker bgw2 = new BackgroundWorker();
    bgw2.DoWork += (s,e) =>
    {
        // doing work
    };

    BackgroundWorker bgw3 = new BackgroundWorker();
    bgw3.DoWork += (s,e) =>
    {
        // doing work
    };

    bgw1.RunWorkerAsync();
    bgw2.RunWorkerAsync();
    bgw3.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)

c# backgroundworker

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

C#中的进度条和后台工作者

目前我正在开发一个需要从Web服务中消耗大量数据的项目.有服务类向服务器发送输入日期并返回结果,由于耗时的过程,需要用户组合进度条和后台工作者向用户显示进程百分比.我已经浏览了很多关于这个主题的示例代码,但仍然无法找到最佳方法.请帮忙,我的代码是关注的,

private  MyCollection[] callWebService(string[] Inputs, string method)
{
    List<string> results = new List<string>();
    string fiel dNames = ""; // todo - fix this if nothing left in loop
    int sizeOfArray = 500;
    for (int i = 0; i < Inputs.Length; i = i + sizeOfArray)
    {
        string[] outputRecords;
        int errorCode;
        string errorString;
        string[] thisFiveHundred = createSubArray(Inputs, i, sizeOfArray);


        iq.NameValuePair[] namevaluepairs = new iq.NameValuePair[0];
        fieldNames = iqOfficeWebservice.BatchStan(method, thisFiveHundred, null, "",        out outputRecords, out errorCode, out  errorString);
        results.AddRange(outputRecords);
    }
    results.ToArray();
    IAddress[] formattedResults …
Run Code Online (Sandbox Code Playgroud)

c# multithreading backgroundworker progress-bar

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