BackgroundWorker是.NET的System.ComponentModel命名空间中的辅助类,提供基于事件的异步模式的一般实现,以管理工作线程,支持协作取消和报告进度。
我正在更新一个 C# WPF 项目,该项目以前使用 WCF 服务,现在调用基于 REST 的 API。 以下代码是 REST API 调用的典型示例: 公共静态异步任务 我正在更新一个 C# WPF 项目,该项目之前使用 WCF 服务,现在调用基于 REST 的 API。 以下代码是 REST API 调用的典型示例: public static async Task<List<KBase>> GetKbase(int shopID) { // set request string uri = ROOT_URI + "kbase/" + shopID.ToString(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", access_token.token); // get HttpResponseMessage response = await http_client.SendAsync(request); if (response.IsSuccessStatusCode) { string result = response.Content.ReadAsStringAsync().Result; List<KBase> kb = JsonConvert.DeserializeObject<List<KBase>>(result); return kb; } else { string result = response.Content.ReadAsStringAsync().Result; gFunc.AddLogEntry("Get Kbase: " + result); } return null; } 如果我使用以下代码调用上述 API 方法,一切都会按预期发生。消息框显示 true。 private async void btnTest_MouseUp(object sender, MouseButtonEventArgs e) { List<Models.API.KBase> kb = await apiSamadhi.GetKbase(1); bool is_data = !(kb == null); MessageBox.Show(is_data.ToString()); } 但是,程序的许多部分我都使用后台工作人员来保持主 UI 线程的响应能力。我创建后台工作者如下: BackgroundWorker bgw; List<Models.API.KBase> kb; private void InitBGW() { bgw = new BackgroundWorker(); bgw.DoWork += bgw_DoWork; bgw.RunWorkerCompleted += bgw_WorkCompleted; } 以下代码显示了 DoWork 和 WorkCompleted 方法: private async void bgw_DoWork(object sender, DoWorkEventArgs e) { kbase = await apiSamadhi.GetKbase(1); } private void bgw_WorkCompleted(object sender, RunWorkerCompletedEventArgs e) { bool is_data = !(kbase == null); MessageBox.Show(is_data.ToString()); System.Threading.Thread.Sleep(1000); is_data = !(kbase == null); MessageBox.Show(is_data.ToString()); } 当 bgw_WorkCompleted 运行时,kbase 为 null,第一个消息框显示 false。然后,在线程休眠一秒钟后,kbase不为空,第二个消息框显示true。 这不是我所期望的行为。就像 bgw_DoWork 中的 await 不起作用一样。为什么 bgw_WorkCompleted 在对 API 的“等待”调用完成之前运行? 我错过了什么或者做了什么愚蠢的事情吗?我需要能够在非 UI 线程上运行“等待”API 调用/任务,并能够在任务完成时更新 UI。 BackgroundWorker 希望 DoWork 处理程序阻塞,但在 async void 的情况下,它会在实际异步操作完成并调用 WorkCompleted 处理程序之前退出 - 这里真正的工作只是 starting 异步操作,而不是等待它完成。 BackgroundWorker 与 async/await 配合不佳。 你可以完全放弃BackgroundWorker,这样的事情应该可以解决问题: private async void InitBGW() { var kbase = await Task.Run(async () => await apiSamadhi .GetKbase(1) .ConfigureAwait(false)); var is_data = kbase is not null; MessageBox.Show(is_data.ToString()); }
Backgroundworker CancelAsync() 不起作用
我正在尝试使用 WorkerClass.bw.CancelAsync() 取消我的后台工作程序。但这根本行不通。 //编辑!我在这里发布了完整的代码。希望这会有所帮助。 好吧,我添加了一些消息框来了解...
我正在实现后台服务,问题是当我在本地运行它时,它工作正常,因为应用程序已启动并正在运行。但在iis中我部署了代码并在iis中启动了服务器。
我有一个作为 Windows 服务运行的 C# 控制台应用程序。它实现了BackgroundService,这是实现Windows 服务的推荐方法。 另外,我正在使用 Hangfire 来启动...
我编写了缓存更新功能。 这是我的 Redis 缓存实现: 公共类RedisCache:ICache { 私有只读 IDatabase _cache; 公共 RedisCache(字符串
在WPF中使用Backgroundworker弹出主应用程序的消息框
在WPF应用程序中,我使用BackgroundWorker定期检查服务器上的条件。虽然这工作正常,但我想弹出一个消息框,通知用户如果在 c 过程中出现故障...
不用说,我是 C# 新手,并且正在做一些基本的事情来学习。我试图理解异步/等待功能。我有一个带有 2 个文本框和一个按钮的表单。当我点击按钮时,...
我正在尝试通过库存软件准确制作并在完成操作后更新交叉库存 但它需要 20 秒才能完成更新,因此需要在不影响客户端进程的情况下完成此过程...
如何从 Interactive Brokers (IB) C# 示例应用程序获取多个历史数据请求。 (线程UI问题,后台线程)
我认为这个问题需要了解 API 附带的 Interactive Broker 的 C# 示例应用程序是如何工作的。我正在尝试修改 IB 的示例 C# 应用程序,该应用程序随 API 一起请求
我不能简单地注入数据库上下文,所以我必须依赖注入 IServiceScopeFactory 并像这样从注册服务中获取它。 AppDbContext 上下文() { 使用 IServiceScope 范围 =
BackgroundWorker 填充 DataGridView
编辑:使用此解决:http://reedcopsey.com/2011/11/28/launching-a-wpf-window-in-a-separate-thread-part-1/ 在我的项目(.net/windows 窗体)中,我正在用一个大的 DataTable 填充一个 DataGridView。
在 singelton 托管服务中访问范围 DbContext
我不能简单地注入数据库上下文,所以我必须依赖注入 IServiceScopeFactory 并像这样从注册服务中获取它。 AppDbContext 上下文() { 使用 IServiceScope 范围 =
使用后台工作者填充 DataGridView - 跨线程操作无效从线程访问的控件
在 c# winforms 应用程序中,我有带有两个日期开始日期和结束日期的 datagridview。我需要在日期范围内填充datagridview。填充datagridview和wind需要很多时间...
我正在创建一个 WPF MVVM 应用程序,其中有一个主窗口和一个框架中显示的不同页面。我想添加一个带有进度条的加载屏幕,该进度条会在
我有一个WinForms应用程序,它正在从BackgroundWorker更新一个TableLayoutPanel。根据设备输入是开(1)还是关(0),颜色和一些文本会相应地改变。 尝试 { /...
如何在同一项目下安装多个服务,在.NET Core Hosted Services中。
目前,我正在将现有的.NET Framework Windows服务转换为.NET Core 3+ Worker服务。在现有的windows服务项目中,有多个服务注册 ...
无法从根提供者处解析作用域服务 "Services.Contracts.IHandler`1[Services.ProcessFile]"。
我正在为net core后台队列工作者创建处理程序。/ 通用类,重用于不同的处理程序 public class QueuedHostedService < T >: BackgroundService { private ...
.NET Core Windows Service中的并行任务在几秒钟后挂起。
我正试图让一个 Windows 服务运行。该服务应该使用 worker 对象来生成多个任务。我在worker对象和每个任务中都使用SemaphoreSlim来等待事件完成,...
我在.NET Core Worker服务中遇到了一些依赖注入问题。请看下面Program.cs文件中的代码。 public static void Main(string[] args) { Log.Logger = new ...
当在Form上运行代码时,有时(通常是在循环时)程序标题会显示 "Not Responding",即使它仍然运行正常。在我的例子中,我正在循环并填充一个数组> 数组到......