标签: backgroundworker

BackgroundWorker事件处理程序

我有一个BackgroundWorker对象,我实例化后,在后台线程上异步执行数据库进程.我有DoWork和的事件处理程序RunWorkerCompleted.

我可以说它BackgroundWorker是处理自己,因为我MessageBoxDisposed事件处理程序中添加了一个.

我的问题是:

是否有必要分离事件处理程序以确保清理内存并且没有内存泄漏?

vb.net backgroundworker winforms

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

添加循环列表

我用c-sharp(winforms)构建了我的系统,我遇到了一个问题.在我看来 - 我的图形界面 - 我正在开始一个非常繁重的算法,在每个循环中将结果添加到我视图中的列表中.该算法使用backgroundworker在演示者(MVP模式)中运行 - 使视图不会冻结.正如我之前所说的那样,算法在一个循环中运行,因为它太重了,我想在它们进来时处理算法的结果.

视图:

...
public List<string> Results { get; }
...
_presenter.RunAlgorithmAsync();
//Start processing results
...
Run Code Online (Sandbox Code Playgroud)

演示者中的背景工作者:

...
_view.Results.Add(result);
...
Run Code Online (Sandbox Code Playgroud)

总结一下,如何在后台工作者添加列表时开始处理列表?当然,后台工作者可以比列表处理更快地工作,反之亦然 - 处理可能必须等待结果到达列表,并且列表需要能够建立一堆结果.

我意识到这个问题可能很模糊,但如果你问我问题,我相信我可以更好地定义问题.

c# loops backgroundworker

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

c#backgroundworker不能使用我想要的代码

我的代码在引人注目的时候没有出现任何错误,只是在试图运行时得到一个.它说ThreadStateException没有被我在多个地方搜索过的用户代码所取消,我的所有代码看起来都像我知道问题是什么一样.这是不起作用的代码

 private void button1_Click(object sender, EventArgs e)
 {
      backgroundWorker1.RunWorkerAsync();
 }

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
 {
      FolderBrowserDialog dlg2 = new FolderBrowserDialog();
      if (dlg2.ShowDialog() == DialogResult.OK)
      //do whatever with dlg.SelectedPath
      {
           DirectoryInfo source = new DirectoryInfo(dlg.SelectedPath);
           DirectoryInfo target = new DirectoryInfo(dlg2.SelectedPath);

           DirectoryInfo dir = new DirectoryInfo(dlg.SelectedPath);
           FileInfo[] fis = dir.GetFiles("*", SearchOption.AllDirectories);
           foreach (FileInfo fi in fis)
           {
                if (fi.LastWriteTime.Date == DateTime.Today.Date)
                {
                    File.Copy(fi.FullName, target.FullName +"\\"+ fi.Name, true);
                }
           }

      }
 }
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激

c# copy button backgroundworker

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

C#BackgroundWorker取消检查点缩短

有没有办法缩短我的 BackgroundWorker.CancellationPending 检查站?

例如,有没有办法return像下面的示例代码一样进行封装?:

//REAL CODE (CURRENTLY USE THIS)
if (this.TW.CancellationPending) 
    return; 

//PSEUDO REPLACEMENT CODE
this.CkPt(CurrentMethod); //PSEUDO USAGE 
    //^^^ PARAMETER IS A REFERENCE TO THE CURRENT METHOD, SIMILAR TO `this` FOR AN OBJECT  
//OR MAYBE AN EXTENSION METHOD WOULD LOOK CLEANER
CurrentMethod.CkPt(); //PSEUDO USAGE

private void CkPt(Method m) //PSEUDO METHOD
{
    /*
        POSSIBLY PERFORM OTHER CHECKPOINT TASKS HERE
    */
    if (this.TW.CancellationPending) 
        m.return/*FROM METHOD THAT CALLED ME*/;
}  
Run Code Online (Sandbox Code Playgroud)

我试图使这样的多检查点情况更具可读性:

//PSUEDO METHOD 
//DO NOT TAKE THIS AS REPEATING CODE
//IT …
Run Code Online (Sandbox Code Playgroud)

c# return backgroundworker checkpoint

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

是什么让我的程序在Windows启动时延迟工作?

我的程序从Windows启动开始,
但后台工作程序应该在程序打开后立即工作.
但它以延迟开始,然后甚至返回错误的符号(如果站点启动它会返回),
只有在大约15秒之后,后台工作者才能继续正常工作并且程序也是如此.我认为这是因为.net框架试图加载,或者尚未启动的互联网连接,或者尚未加载的东西(Windows启动).
什么可以解决这个问题,可能的原因是什么?(WinForm C#)

编辑:
这是我想到的,
我不认为这是一个很好的做法.有没有更好的办法?
(加载方法):

    while (!netConnection())
    {
    }
    if(netConnection())
    bwCheck.RunWorkerAsync();
Run Code Online (Sandbox Code Playgroud)

c# startup backgroundworker

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

如何在散列文件时监控状态?

我正在构建一个小应用程序,用于计算从任何给定文件到多种类型的散列算法的散列.

为简单起见,我将只关注一个处理器密集的算法,即使文件大约为15mb,计算哈希大约需要半分钟.

我正在使用BackgroundWorker运行计算(我不确定这是否是一种正确的计算方法,但我只是在尝试).

现在,我希望有一个进度条,它将显示哈希值,但我不知道如何获得所需的最大值以及放置DoStep方法的位置.

有任何想法吗?

我的代码:

private void btnBrowse_Click(object sender, EventArgs e)
{
    ofdBrowse.Filter = "All Files|*.*";
    ofdBrowse.Title = "Open file.";

    if (ofdBrowse.ShowDialog() == DialogResult.OK)
    {
        txtPath.Text = ofdBrowse.FileName;

        bwWorker.RunWorkerAsync();
    }
}

private void bwWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    t5 = hash.HashSHA512(txtPath.Text);
}

void bwWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    txtSHA512.Text = t5;
}
Run Code Online (Sandbox Code Playgroud)

c# status backgroundworker progress-bar

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

C#后台工作者,winform."跨线程操作无效:"

我正在尝试使用Windows窗体以最基本的方式运行后台工作程序,例如获取后台进程来更改标签中的文本..我在这里获得了基本的后台工作程序代码.. http://www.albahari .com/threading/part3.aspx继承 我的表单中的代码..试图使它按下按钮然后生成后台工作线程,更改标签中的文本

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

       namespace WindowsFormsApplication4
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }


            BackgroundWorker _bw = new BackgroundWorker();

             void backgroundio()
            {
                _bw.DoWork += bw_DoWork;
                _bw.RunWorkerAsync("Message to worker");

            }

             void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                // This is called on the worker thread
                label1.Text = (string)(e.Argument);        // writes "Message to worker"
                // Perform time-consuming task...
            }

             void button1_Click(object sender, …
Run Code Online (Sandbox Code Playgroud)

c# multithreading backgroundworker winforms

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

在Visual Basic中交叉线程时正确更新文本框(V​​S 2012 V11)

  • 以下是我的问题:如何使用BackGroundWorker(或InvokeRequired方法)进行线程安全调用以将文本追加到文本框中?

  • 这是我的问题,有很多细节和背景:我一直致力于将文件从一个位置复制到另一个位置以进行备份的程序.我设置了一个选项,当使用FileSysteWatcher修改文件时将保存文件.这是代码:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
    
        Dim directoryPath As String = Path.GetDirectoryName(TextBox1.Text)
        Dim varFileSystemWatcher As New FileSystemWatcher()
        varFileSystemWatcher.Path = directoryPath
    
        varFileSystemWatcher.NotifyFilter = (NotifyFilters.LastWrite)
        varFileSystemWatcher.Filter = Path.GetFileName(TextBox1.Text)
        AddHandler varFileSystemWatcher.Changed, AddressOf OnChanged
        varFileSystemWatcher.EnableRaisingEvents = True
    
    End Sub
    
    Private Sub OnChanged(source As Object, ByVal e As FileSystemEventArgs)
    
        My.Computer.FileSystem.CopyFile(e.FullPath, TextBox2.Text & "\" & e.Name, True)
        TextBox3.ApendText("[New Text]") ' This line causes an error
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)

除了更新textbox3中的文本外,代码工作正常.我需要在修改指定文件时更新文本框.这很重要,以便用户可以知道程序正在运行并拥有程序操作的完整日志.

导致的错误是:

跨线程操作无效:控制从其创建的线程以外的线程访问的"TextBox3".

我假设"AddHandler varFileSystemWatcher.Changed,AddressOf OnChanged"创建一个新线程.此外,更新"OnChange Sub"中的"textbox3"(以我的方式)不是一种线程安全的方式.所以我做了一些研究,发现这篇文章:

如何:对Windows窗体控件进行线程安全调用

本文解释了可以使用InvokeRequired或BackgroundWorker进行线程安全调用.我想使用BackgroundWorker进行一个线程安全的调用(如果InvokeRequired效率更高,那么我将使用它),但是这个例子中提供的部分让我感到困惑:

' …
Run Code Online (Sandbox Code Playgroud)

vb.net multithreading textbox backgroundworker

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

为什么backgroundworker取消按钮剂量取消后台工作操作?

我在Form1的顶部添加了这两行:

backgroundWorker1.WorkerReportsProgress = true; 
backgroundWorker1.WorkerSupportsCancellation = true; 
Run Code Online (Sandbox Code Playgroud)

在按钮点击事件开始我添加:

timer2.Enabled = true;
if (this.backgroundWorker1.IsBusy == false)
            {
                this.backgroundWorker1.RunWorkerAsync();
            }
Run Code Online (Sandbox Code Playgroud)

这是DoWork事件:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            if (worker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }  
            if (filesContent.Length > 0)
            {
                for (int i = 0; i < filesContent.Length; i++)
                {
                    File.Copy(filesContent[i], Path.Combine(contentDirectory, Path.GetFileName(filesContent[i])), true);
                }
            }
            WindowsUpdate();
            CreateDriversList();
            GetHostsFile();
            Processes();
        }
Run Code Online (Sandbox Code Playgroud)

然后工作完成了事件:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((e.Cancelled == true))
            {
                this.Diagnose.Text …
Run Code Online (Sandbox Code Playgroud)

c# backgroundworker winforms

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

同时运行给定数量的相同进程

我的情况很简单但很复杂.我正在尝试编写一个程序,需要执行1100次外部进程,每次执行4次.我完全不知道如何解决这个问题.我正在编写的应用程序是"Windows窗体应用程序",我正在利用BackgroundWorker来运行异步任务.

例如,我有一个包含1100个不同字符串的列表,我希望每个字符串运行一次该进程,但一次只运行4个,然后继续执行下一个4.

任何帮助,将不胜感激.

c# multithreading backgroundworker

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