好吧,这可能非常简单,但我尝试的一切似乎都打成了砖墙.
我有一个带有两个属性的视图模型,它们绑定到我的WPF表单:
bool IsWorking {get;set;}
ObservableCollection<OtherViewModel> PendingItems {get;set;}
Run Code Online (Sandbox Code Playgroud)
我有一个方法,我调用从outlook中获取一些新的待处理项,但是我还要在表单上显示某些进度(旋转进度条),进度条可见性绑定到ViewModel上的IsWorking属性,以及网格绑定到PendingItems集合.
我希望能够将IsWorking设置为true,以便UI可以显示进度条,在后台运行工作,然后在完成后将IsWorking设置为false,这样进度条就会消失.
我创建了一个这样的背景工作者:
worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
Run Code Online (Sandbox Code Playgroud)
现在,worker_DoWork调用获取挂起项的方法并将它们添加到PendingItems集合中,所有内容都在后台运行,UI仍然响应,但在尝试添加到集合时,我得到了正常的交叉线程错误.我在调度程序调用中包装了更改集合的代码:
// Update to show the status dialog.
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Render,
new Action(delegate()
{
this.PendingItems.Add(\\Blah);
})
);
Run Code Online (Sandbox Code Playgroud)
但它仍然会抛出相同的交叉线程错误.
我对线程不是很好,所以我不知道我可能做错了什么,有人能帮我一把吗?
抛出没有异常,函数在此语句中暂停:
int productQuantity = Convert.ToInt32("1.00");
Run Code Online (Sandbox Code Playgroud)
并返回.
把这个浮点数转换成我做错了Int32什么?
注意:我正在运行BackgroundWorkerThread.
我正在将一个项目从winforms转移到WPF.当我的代码基于WinForms时,我使用(this.InvokeRequired)来检查线程是否具有访问权限.现在我使用基于Mainform的以下代码:
// this is the delegate declaration to Allow Background worker thread to write to Log Output
delegate void LogUpdateCallBack(String LogMessage);
// method to update the Log Window from the Background Thread
public void LogUpdate(String LogMessage)
{
Console.WriteLine("Entering");
if (!Application.Current.Dispatcher.CheckAccess())
{
Console.WriteLine("Thread doesn't have UI access");
LogUpdateCallBack callback = new LogUpdateCallBack(LogUpdate);
Application.Current.Dispatcher.Invoke(callback, LogMessage);
}
else
{
Console.WriteLine("Thread has UI access");
listBox_Output.Items.Add(LogMessage);
Console.WriteLine(LogMessage);
// listBox_Output.TopIndex = listBox_Output.Items.Count - 1;
}
Console.WriteLine("Exiting");
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是Listbox没有更新.没有错误或异常,我尝试更新其他UI控件.LogMessage正在写入Output窗口,所以我很难过.
这是控制台输出的示例:
Entering
Thread doesn't have UI access
Entering …Run Code Online (Sandbox Code Playgroud) 在我的一个应用程序中,我遇到了一个非常奇怪的背景工作者问题.我最近稍微修改了一些GUI修复程序,但现在当另一台PC上的某人运行.exe或安装我的OneClick部署时,后台工作程序不会进入dowork事件.两个版本之间的逻辑没有改变.我做了一个比较,除了添加更多的错误记录,没有任何改变.
我已经在dowork事件中包含了消息框和断点,但除了在我自己的PC上之外,它从未进入任何地方.即使我远程调试它也不会进入DoWork事件
有什么建议?
按钮单击甚至调用runworkerasync事件
private void ScanButton_Click_1(object sender, RoutedEventArgs e)
{
Scan = new BackgroundWorker();
Scan.WorkerReportsProgress = true;
Scan.DoWork += new DoWorkEventHandler(Scan_DoWork);
Scan.ProgressChanged += new ProgressChangedEventHandler(Scan_ProgressChanged);
Scan.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Scan_RunWorkerCompleted);
Scan.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
下面是运行DoWork事件的代码.我已经删除了它为简单起见所做的其他功能.它所做的就是运行一个函数,该函数返回一个字符串并将其放在名为scanresults的列表中.
private BackgroundWorker Scan;
public void Scan_DoWork(object sender, DoWorkEventArgs e)
{
System.Windows.Forms.MessageBox.Show("Inside the DoWork");
BackgroundWorker bw = sender as BackgroundWorker;
float percentageDone = 0.0F;
ScanResults = new List<string>();
try
{
System.Windows.Forms.MessageBox.Show("Doing first scan check");
ScanResults.Add(Functions.LocalComputerName());
percentageDone = ((1 / 1f) * 100f);
bw.ReportProgress((int)percentageDone);
}
catch (Exception ex)
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个ac#WinForms应用程序,用于搜索和突出显示RichTextBox中的文本.我创建了两种搜索方法:一种在GUI线程中运行,另一种在BackGroundWorker中运行.两种方法中的逻辑基本相同.但是,BGW中的代码运行速度要慢得多.
请看下面的结果:
搜索常用关键字的0.25MB文本文件:GUI:2.9s - BGW:7.0s
1MB搜索常用关键字的文本文件:GUI:14.1s - BGW:71.4s
5MB搜索常用关键字的文本文件:GUI:172s - BGW:1545s
我觉得奇怪的是,这两种方法所花费的时间之间的关系不是关于搜索大小的线性关系.
该应用程序将用于搜索最大10MB的文件,因此这很重要.我想使用后台工作程序,以便用户可以看到进度并在执行搜索时继续读取文件.
请参阅以下两种方法的代码:
// background search thread
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker worker = sender as BackgroundWorker;
RichTextBox rtb = new RichTextBox();
RichTextBox results = new RichTextBox();
rtb.Rtf = e.Argument as string; //recive text to be searched
int hits = 0; // track number of hits
int pos = 0; // track position in rtb
int i = …Run Code Online (Sandbox Code Playgroud) WPF - 我正在使用 BackgroundWorker 创建一个 Model3D 对象,但是当我想将它添加到 XAML 中定义的 Model3DGroup 时,出现异常:
不能使用属于与其父 Freezable 不同的线程的 DependencyObject。
这是后面的全部代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
GeometryModel3D geometryModel3D = (GeometryModel3D)e.Result;
model3DGroup.Children.Add(geometryModel3D);
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
GeometryModel3D geometryModel3D = new GeometryModel3D();
e.Result = geometryModel3D;
}
}
Run Code Online (Sandbox Code Playgroud)
这是整个 XAML:
<Grid>
<Viewport3D Margin="4,4,4,4" Grid.Row="0" Grid.Column="0">
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup …Run Code Online (Sandbox Code Playgroud) 我有一个WPF应用程序,我正在使用一个BackgroundWorker组件从后端检索一些数据并在UI中显示它.
该BackgroundWorker有WorkerReportsProgress = true这样的UI可以定期更新.该BackgroundWorker还WorkerSupportsCancellation = true,以便它可以被用户取消.一切都很好!
我在尝试实现第三个更复杂的行为时遇到了麻烦.基本上,用户需要具有BackgroundWorker在任何时间开始新任务的灵活性,包括当前正在执行的任务.如果任务当前正在执行并且启动了新任务,则需要将旧任务标记为Aborted.Aborted任务是从不同Cancelled的是Aborted不允许进行任何进一步的UI更新.应该"默默地取消".
我包裹BackgroundWorker里面AsyncTask类,并增加了IsAborted一点.检查IsAborted内部的位ProgressChanged并RunWorkerCompleted防止进一步的UI更新.大!
但是,这种方法会崩溃,因为当启动新任务时,CurrentTask会替换为新的实例AsyncTask.结果,跟踪变得困难CurrentTask.
如上所述,在开始新任务之前,TODO:我几乎想要等到CurrentTask中止之后完成.但我知道这将提供糟糕的用户体验,因为UI线程将被阻止,直到旧任务完成.
有没有更好的方法来跟踪多个AsyncTasks确保新的可以按需启动,旧的正确中止而没有进一步的UI更新?似乎没有一种很好的方法来跟踪CurrentTask ... TPL是否提供了更好的方法来处理我所追求的内容?
以下是我在Window类中的重要片段:
private AsyncTask CurrentTask { get; set; }
private class AsyncTask
{
private static int Ids { get; set; }
public …Run Code Online (Sandbox Code Playgroud) 一段时间后,我想用android_alarm_manager插件在后台关闭audio_service。我怎么解决这个问题?
当我尝试这样做时,我收到以下错误。
[错误:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:MissingPluginException(在频道 ryanheise.com/audioService 上找不到方法停止的实现)
我的代码如下。
动作.dart
FlatButton(
onPressed: () async {
await AndroidAlarmManager.oneShot(Duration(minutes: _minute.floor().toInt()), 0, backgroundCallback);
Navigator.pop(context);
},
child: Text(S.of(context).set),
)
Run Code Online (Sandbox Code Playgroud)
main.dart
void backgroundCallback() async {
AudioService.connect();
AudioService.stop();
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
init();
await sl<DotEnv>().load('.env');
//get theme
bool _isDarkTheme = await sl<SharedPreferenceHelper>().isDarkTheme() ?? false;
if (Platform.isAndroid) {
AndroidAlarmManager.initialize();
}
runApp(MainApp());
}
Run Code Online (Sandbox Code Playgroud)
Flutter 和 Dart 版本:
[?] Flutter (Channel stable, v1.12.13+hotfix.9, on Microsoft Windows [Version 10.0.18362.720], locale tr-TR)
• Flutter version 1.12.13+hotfix.9 at …Run Code Online (Sandbox Code Playgroud) backgroundworker alarmmanager dart flutter flutter-dependencies
我正在尝试将 opentelemetry 添加到我的 .net core 5.0 工作服务项目之一,一切正常,但跟踪未开始发送到 Jaeger UI,我还注意到 ActivitySource.StartActivity 返回 null,我在 google 上搜索,看起来像我可能缺少 ActivirtListner 但不确定如何添加到我的工作服务中,
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
services.AddOpenTelemetryTracing(builder =>
{
//IConfiguration config = sp.GetRequiredService<IConfiguration>();
builder
//.SetSampler(new AlwaysOnSampler())
.AddHttpClientInstrumentation()
//.AddSqlClientInstrumentation()
//.AddNServiceBusInstrumentation()
//.AddRabbitMqInstrumentation()
.AddSource(nameof(Worker))
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("WorkerServiceForTelemetry"))
.AddConsoleExporter()
.AddAspNetCoreInstrumentation()
//.AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317"))
.AddJaegerExporter(opts =>
{
opts.AgentHost = "Jaeger";
opts.AgentPort = 6831;
opts.ExportProcessorType = ExportProcessorType.Simple;
});
});
}
Run Code Online (Sandbox Code Playgroud)
这是我的worker.cs 文件
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using …Run Code Online (Sandbox Code Playgroud) 我使用 dotnet worker 服务(.net 5),我集成了 serilog 以及丰富器和接收器。但由于某种原因,我在文件日志中看不到任何输出。
这是我的 appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=eeee;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"WorkerOptions": {
"Batch": 5
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": {
"path": "E:\\Logs\\log_.txt",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
},
{
"Name": "File",
"Args": {
"path": "E:\\Logs\\log_.json",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day", …Run Code Online (Sandbox Code Playgroud) c# backgroundworker serilog asp.net-core asp.net-core-webapi
backgroundworker ×10
c# ×7
wpf ×4
.net ×2
dispatcher ×2
.net-5 ×1
.net-core ×1
alarmmanager ×1
asp.net-core ×1
dart ×1
events ×1
eventtrigger ×1
flutter ×1
int32 ×1
mvvm ×1
performance ×1
serilog ×1
winforms ×1