标签: backgroundworker

WPF Dispatcher,后台工作者和很多痛苦

好吧,这可能非常简单,但我尝试的一切似乎都打成了砖墙.

我有一个带有两个属性的视图模型,它们绑定到我的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)

但它仍然会抛出相同的交叉线程错误.

我对线程不是很好,所以我不知道我可能做错了什么,有人能帮我一把吗?

wpf multithreading dispatcher mvvm backgroundworker

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

尝试将float转换为Int32时,Convert.ToInt32(float)失败

抛出没有异常,函数在此语句中暂停:

int productQuantity = Convert.ToInt32("1.00");
Run Code Online (Sandbox Code Playgroud)

并返回.

把这个浮点数转换成我做错了Int32什么?

注意:我正在运行BackgroundWorkerThread.

c# int32 backgroundworker

6
推荐指数
2
解决办法
3348
查看次数

来自Background worker的UI访问问题

我正在将一个项目从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)

c# wpf backgroundworker

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

C#后台工作者除了我自己以外没有触发任何电脑上的dowork事件

在我的一个应用程序中,我遇到了一个非常奇怪的背景工作者问题.我最近稍微修改了一些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)

c# events eventtrigger backgroundworker

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

为什么我的BackGroundWorker线程中的相同代码比我的GUI线程中的代码慢得多?

我正在尝试创建一个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)

.net c# performance backgroundworker winforms

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

不能使用属于与其父 Freezable 不同的线程的 DependencyObject

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 multithreading dispatcher backgroundworker

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

跟踪多个BackgroundWorkers

我有一个WPF应用程序,我正在使用一个BackgroundWorker组件从后端检索一些数据并在UI中显示它.

BackgroundWorkerWorkerReportsProgress = true这样的UI可以定期更新.该BackgroundWorkerWorkerSupportsCancellation = true,以便它可以被用户取消.一切都很好!

我在尝试实现第三个更复杂的行为时遇到了麻烦.基本上,用户需要具有BackgroundWorker在任何时间开始新任务的灵活性,包括当前正在执行的任务.如果任务当前正在执行并且启动了新任务,则需要将旧任务标记为Aborted.Aborted任务是从不同Cancelled的是Aborted不允许进行任何进一步的UI更新.应该"默默地取消".

我包裹BackgroundWorker里面AsyncTask类,并增加了IsAborted一点.检查IsAborted内部的位ProgressChangedRunWorkerCompleted防止进一步的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)

.net c# wpf backgroundworker task-parallel-library

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

一段时间后,我想用android_alarm_manager插件在后台关闭audio_service

一段时间后,我想用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

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

将 Opentelemetry 添加到 .Net Core 辅助服务

我正在尝试将 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)

c# backgroundworker .net-core .net-5 open-telemetry

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

Serilog不将日志输出到txt文件中

我使用 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

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