我有一个 Windows 窗体应用程序。主窗体内部有一个循环,迭代大约 3000 次,在新线程上创建类的新实例来执行一些计算。请记住,此设置使用线程池,当此循环只有大约 100 次迭代(要处理 100 个资产)时,UI 确实保持响应。但一旦这个数字开始大幅增加,UI 就会锁定到 Eggtimer 模式,因此写入表单上列表框的日志将变得不可读。
我是否正确地认为解决此问题的最佳方法是使用后台工作人员?UI 是否锁定,因为即使我使用许多不同的线程(为了速度),UI 本身并不位于其自己的单独线程上?
非常感谢建议的实施。
因此,我们可以说,我决定以 100 个为一组进行批量处理,而不是仅仅发送并排队 3000 个资产进行处理。我将如何有效地做到这一点?我早些时候尝试添加“Thread.Sleep(5000);” 每一批 100 个都被发射之后,但整个事情似乎一团糟......
我正在尝试学习如何在我的项目中使用后台工作人员,但我不断收到错误,我只是不知道该怎么做。在设计器中我创建了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
我有一个 .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 …
我想在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)
似乎工作得很好。
我叫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
谢谢
我想用它BackgroundWorker来从GUI执行数据库事务.
我如何命令BackgroundWorker执行工作然后等待工作人员完成,同时保持GUI响应?
我是否必须DoEvents为此目的使用,还是有另一种方式?
我有一个运行和查找东西的后台工作程序,当它找到东西时,我想更新我的主WinForm.说我遇到的问题是,当我试图从我的后台工作更新我的WinForm的,我得到告诉我,我不能修改我的后台工作之外所做的(换句话说事情,一切都在我的表单错误).
有人可以提供一个简单的代码示例,说明如何让我的代码以我想要的方式工作吗?谢谢!
我有一个BackgroundWorker在非GUI线程上调用函数.我注意到对于某些表单元素,我可以在不进行调用的情况下更新GUI.其他人仍然会导致运行时错误,因为程序试图以非线程安全的方式更新GUI.
这是为什么?
在我的课程中,我注意到下面的模式.我怎么能把它抽象出来呢?有什么建议?
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) 目前我正在开发一个需要从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) backgroundworker ×10
c# ×8
winforms ×3
.net ×1
.net-5 ×1
asp.net-core ×1
progress-bar ×1
threadpool ×1
wpf ×1