标签: backgroundworker

C#线程问题

为了与线程,代表和后台工作者一起玩,我正在整理一些小应用程序,我对其中一个有点麻烦.我有一个Windows表单,带有文本框,按钮和richttext.当我按下按钮时,文本框中的文本被用作实例化类的参数,如下所示:

public partial class Form1 : Form
{
    private BackgroundWorker backgroundWorker;

    public Form1()
    {
        InitializeComponent();            
    }

    private void button1_Click(object sender, EventArgs e)
    {   
        backgroundWorker = new BackgroundWorker();
        backgroundWorker.DoWork += new DoWorkEventHandler(worker_DoWork);
        backgroundWorker.RunWorkerAsync();
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        new Thread((ThreadStart)delegate()
        {
            this.BeginInvoke((ThreadStart)delegate()
            {
                foreach (string line in textBox1.Lines)
                {  
                    Dig digger = new Dig(line, textBox1.Text);
                    digger.DomainChecked += new Dig.DomainCheckedHandler(OnUpdateTicker);

                    string response = digger.GetAllInfo();

                    richTextBox1.AppendText(response);
                    Application.DoEvents();
                }
            });
        }).Start();
    }

    void OnUpdateTicker(string msg)
    {
        new Thread((ThreadStart)delegate()
        {
            this.BeginInvoke((ThreadStart)delegate()
            {
                label4.Text …
Run Code Online (Sandbox Code Playgroud)

c# multithreading backgroundworker

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

此BackgroundWorker当前正忙,无法同时运行多个任务

我正在尝试在WPF应用程序中使用后台工作程序.繁重的任务使用WebClient下载一些HTML并从中解析一些信息.理想情况下,我希望在不锁定UI的情况下进行下载和解析,并在完成工作后将结果放入UI中.

它运行正常,但是,如果我快速提交"下载和解析"命令,我会收到错误:

此BackgroundWorker当前正忙,无法同时运行多个任务

所以我做了一些谷歌搜索,似乎我可以启用.WorkerSupportsCancellation后台工作者的属性,只是.CancelAsync().但是,这不能按预期工作(取消当前的下载和解析).

我仍然得到上述错误.

这是我的代码:

//In window constructor.
_backgroundWorker.WorkerSupportsCancellation = true;
_backgroundWorker.DoWork += new DoWorkEventHandler(_backgroundWorker_DoWork);
_backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_backgroundWorker_RunWorkerCompleted);

//Declared at class level variable.
BackgroundWorker _backgroundWorker = new BackgroundWorker();

//This is the method I call from my UI.
private void LoadHtmlAndParse(string foobar)
{
    //Cancel whatever it is you're doing!
    _backgroundWorker.CancelAsync();

    //And start doing this immediately!
    _backgroundWorker.RunWorkerAsync(foobar);
}

POCOClassFoo foo = new POCOClassFoo();

void _backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //This automagically sets the UI to the …
Run Code Online (Sandbox Code Playgroud)

c# wpf backgroundworker

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

内联后台工作者

在 C# 中,我有两个代码块,它们打开并写入我打开的进程,我希望它们在同一个函数中同时运行。我找到了具有匿名方法的 BackgroundWorker?但是当我试图实现它时,它不会在 lambda 表达式中运行代码。

BackgroundWorker bgwanalysis = new BackgroundWorker();
bgwanalysis.DoWork += delegate
{
 ...codehere..
};

while (bgwanalysis.IsBusy)
{
  Thread.Sleep(2000);
}
Run Code Online (Sandbox Code Playgroud)

我知道我错过了一些基本的东西,有人可以帮我补充吗?谢谢

c# backgroundworker

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

WPF中的视图和视图模型

我一直在使用WPF中的MVVM,并且对于人们有一个快速的问题.现在我有:

  • MainWindow由MenuBar和UserControl组成
  • UserControl(如上所述)基本上包含一个Grid.

我在UserControl中公开了对Grid Properties的访问,但是User Control不知道什么也不与MainWindow交互.

我还有一个我调用ViewModel的类,它为我操作MainWindow/UserControl.我的理解是ViewModel知道View(MainWindow/UserControl)以及如何操作它,而View通常对ViewModel一无所知.

如果我有这个权利,这是我的问题:

  1. 当我按下MainWindow MenuBar上的按钮时,我想执行操作.现在,这些操作必然会在MainWindow中说一个EventHandler,并且EventHandler实例化ViewModel并调用方法进行处理,如下所示:

    private void RunQueryMenuItemAdvClick(object pSender, RoutedEventArgs pRoutedEventArgs)
    {
        ViewModel vViewModel = new ViewModel(this);
        vViewModel.RunQuery();
    }
    
    Run Code Online (Sandbox Code Playgroud)

View Model看起来像这样:

    public class ViewModel
{
    private DataProvider fDataProvider;

    private MainWindow fMainWindow;

    private BackgroundWorker fQueryWorker = new BackgroundWorker();

    public ViewModel(MainWindow pMainWindow)
    {
        fDataProvider = new DataProvider();
        fMainWindow = pMainWindow;

        //Query Worker
        fQueryWorker.DoWork += QueryWorkerDoWork;
        fQueryWorker.RunWorkerCompleted += QueryWorkerCompleted;
    }

    private void QueryWorkerCompleted(object pSender, RunWorkerCompletedEventArgs pRunWorkerCompletedEventArgs)
    {
        fMainWindow.UserControl_Data.busyIndicator1.IsBusy = false;
        fMainWindow.UserControl_Data.DataToPresent = pRunWorkerCompletedEventArgs.Result;
    }

    private void QueryWorkerDoWork(object pSender, …
Run Code Online (Sandbox Code Playgroud)

c# wpf mvvm backgroundworker viewmodel

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

C#BackgroundWorker是否可以在非多核CPU上运行?

我有一个使用C#制作的应用程序,它使用BackgroundWorker.它将部署到客户端PC.我的问题是,它是否可以在没有多核处理器的计算机上运行(BackgroundWorker)?

或者BackgroundWorker仅适用于多核处理器?

c# multithreading backgroundworker

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

如何使用ProgressBar更新正确实现BackgroundWorker?

- 更新 - 14/10也问了这个问题

为了让正在发生的事情,并考虑到的意见,并从本文的一些明确的想法在这里

我现在真正想要做的是调用一个带有进度条的新表单并运行和动画,而我的后台线程运行我的长进程到数据库,然后调用一个关闭表单事件

后台工作人员在这里设置

 public partial class MainWindow : Window
{
    //Declare background workers
    BackgroundWorker bw = new BackgroundWorker();
    BackgroundWorker bwLoadCSV = new BackgroundWorker();
    BackgroundWorker bwProgressBar = new BackgroundWorker();
Run Code Online (Sandbox Code Playgroud)

代表们在这里补充道

  public MainWindow()
    {
        bwLoadCSV.WorkerReportsProgress = true;
        bwLoadCSV.WorkerSupportsCancellation = true;
        bwLoadCSV.DoWork += new DoWorkEventHandler(bwLoadCSV_DoWork);
        bwLoadCSV.ProgressChanged += new ProgressChangedEventHandler(bwLoadCSV_ProgressChanged);
        bwLoadCSV.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwLoadCSV_RunWorkerCompleted);
Run Code Online (Sandbox Code Playgroud)

这里的调用是从主窗口类进行的

  private void CSV_Load_Click(object sender, RoutedEventArgs e)
    ///Function to read csv into datagrid
    ///
    {
        //Turn Cursor to wait
        System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;

        //Test …
Run Code Online (Sandbox Code Playgroud)

c# wpf multithreading backgroundworker

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

Thread,ThreadPool和BackgroundWorker之间的区别

我很多时候在线程的帮助下调用方法

static void Main( string[] args )
{
    Thread t = new Thread( MyFunction );
    t.Start();
}

static void MyFunction()
{
    //code goes here
}
Run Code Online (Sandbox Code Playgroud)

有些时候我ThreadPool也喜欢上课

System.Threading.ThreadPool.QueueUserWorkItem(delegate {
    MyFunction();
}, null);
Run Code Online (Sandbox Code Playgroud)

但我不明白在线程类或ThreadPool类的帮助下调用任何方法有什么区别

所以我正在寻找一个关于Thread和ThreadPoolclass 之间有什么区别的好讨论.还需要知道何时应该使用Thread类来调用方法以及何时ThreadPool调用任何方法的类?如果可能的话,还要与样本代码一起讨论样本情况

另一个非常重要的问题是,如果我启动多个线程,那么我的应用程序性能会变低还是差?如果是,那么告诉我为什么......?

现在还告诉我什么是BackgroundWorker类以及它与Thread和ThreadPool类的不同之处.我听到BackgroundWorker该类还创建了一个单独的线程来运行任何方法.所以请讨论它与Thread和ThreadPoolclass的不同之处以及何时应该去BackgroundWorker上课.

这是一个小样本代码 BackgroundWorker

private void button1_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();

        // this allows our worker to report progress during work
        bw.WorkerReportsProgress = …
Run Code Online (Sandbox Code Playgroud)

c# multithreading backgroundworker threadpool

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

在线程之间同步字节[2400000]

我想在后台工作程序中创建一个大字节数组.完成工作后,后台工作人员应将数据提供给主线程.

我怎样才能做到这一点?

c# multithreading backgroundworker

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

Hangfire如何处理应用程序域重启?

在我的ASP.NET MVC应用程序中,我将运行后台任务,有时持续约10分钟.我已经阅读了这个主题,看到应用程序域有时会重新启动,从而删除我的线程.

所以我找了一些解决方案.我找到的主要解决方案是Hangfire.我知道它会在失败等情况下重新启动作业,但是他们会以某种方式"绕过"应用程序域重新启动,还是只在这种情况下重新启动作业?

asp.net asp.net-mvc appdomain backgroundworker hangfire

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

有没有其他更好的方法将参数传递给backgroundworker runasync?

我是C#的新手,目前正在开展一个需要BackgroundWorkers的项目.我发现BackgroundWorker RunWorkerAsync只需要一个对象作为参数.但是在某些情况下我需要将多个对象传递给RunWorkerAsync方法.

我目前所做的是将所有对象加载到List中,然后将它们作为单个List对象传递,该对象工作正常.但我的问题是,这可以做得更好还是更好?这种方法有什么问题吗?

List<object> data = new List<object>(3);

List.Add(object1);
List.Add(object2);
List.Add(object3);

bwImportData.RunWorkerAsync(data);

private void DoWork(object sender, DoWorkEventArgs e)
{
   List<object> data = e.Arguments a List<object>
   objecttype1 object1 = data[0] as objecttype1;
   objecttype2 object2 = data[0] as objecttype2;
   objecttype3 object2 = data[0] as objecttype3;

   //Do stuff

}
private void RunWorker(object sender, RunWorkerCompletedEventArgs e)
{
   //Do stuff stuff stuff
}
Run Code Online (Sandbox Code Playgroud)

c# backgroundworker

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