Tag: backgroundworker

C#使用backgroundworker进程更新并附加文本框值

我有一个ac #windows form app我一起扔了。 这很简单: 输入: 文字字符串 源文件夹路径 目标文件夹路径 整数计数 该应用程序搜索源文件夹中的文本文件以查找输入的文本字符串; 如果找到该字符串,则将该文件和具有相同名称的图像文件复制到目标文件夹。 它会根据整数输入多次执行此操作。 所以我有一个按钮,在按钮点击事件我打电话 ProcessImages(tbDID.Text, tbSource.Text, tbDest.Text, comboBoxNumberImages.SelectedItem.ToString()); 这是: private void ProcessImages(string DID, string SourceFolder, string DestFolder, string strNumImages) { int ImageCounter = 0; int MaxImages = Convert.ToInt32(strNumImages); DirectoryInfo di = new DirectoryInfo(SourceFolder); foreach (FileInfo fi in di.GetFiles(“*.txt”)) { if (fi.OpenText().ReadToEnd().Contains(DID)) { //found one! FileInfo […]

如何测试使用BackgroundWorker加载的ViewModel?

MVVM的一个好处是ViewModel的可测试性。 在我的特定情况下,我有一个VM在调用命令时加载一些数据,以及相应的测试: public class MyViewModel { public DelegateCommand LoadDataCommand { get; set; } private List myData; public List MyData { get { return myData; } set { myData = value; RaisePropertyChanged(() => MyData); } } public MyViewModel() { LoadDataCommand = new DelegateCommand(OnLoadData); } private void OnLoadData() { // loads data over wcf or db or […]

BackgroundWorker在VSTO中不起作用

我有一名背景工作者。 在我调用worker之前,我禁用了一个按钮并使gif可见。 然后我调用runworkerasync方法,它运行正常,直到comleteion。 在’RunWorkerCompleted()’上,我得到一个跨线程错误。 知道为什么吗? private void buttonRun_Click(object sender, EventArgs e) { if (comboBoxFiscalYear.SelectedIndex != -1 && !string.IsNullOrEmpty(textBoxFolderLoc.Text)) { try { u = new UpdateDispositionReports( Convert.ToInt32(comboBoxFiscalYear.SelectedItem.ToString()) , textBoxFolderLoc.Text , Properties.Settings.Default.TemplatePath , Properties.Settings.Default.ConnStr); this.buttonRun.Enabled = false; this.pictureBox1.Visible = true; BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); bw.RunWorkerAsync(); //backgroundWorker1.RunWorkerAsync(); } catch […]

BackgroundWorkermultithreading访问表单

我正在使用同时运行的5个BackgroundWorker对象用于特定目的,并且所有这些对象都必须更改相同的标签。 我怎么做? 如何从多个线程修改表单呢? 如果我想更改公共字符串,我该怎么做呢?

在backgroundworker运行时显示等待光标

在我的Windows应用程序启动期间,我必须调用Web服务来检索一些默认数据以加载到我的应用程序中。 在加载表单期间,我运行一个后台工作程序来检索这些数据。 我想显示等待光标,直到检索到这些数据。 我该怎么办? 我已经尝试在调用backgroundworker运行之前设置等待光标。 当我报告100的进度时,我将其设置回默认光标。 等待光标出现但是当我移动鼠标时它会消失。 环境: Windows 7 Pro 64位 VS2010 C#.NET 4.0 Windows窗体 编辑:我按照Jay Riggs建议的方式设置光标。 它只有在我不移动鼠标时才有效。 * *更新:我创建了一个单击按钮,执行以下操作:当我按下按钮并单击并移动鼠标时,无论我是否移动鼠标,都会显示等待光标。 void BtnClick() { Cursor = Cursors.WaitCursor; Thread.Sleep(8000); Cursor = Cursors.Default; } 如果我执行以下操作:我看到等待光标,当我移动鼠标时,它会消失在窗体内。 如果我移动到状态栏或菜单栏,则会出现等待光标。 Cursor = Cursors.WaitCursor; if (!backgroundWorker.IsBusy) { backGroundWorker.RunWorkerAsync(); } void backGroundWorkerDoWork(object sender, DoWorkEventArgs e) { Thread.Sleep(8000); } void backGroundWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) […]

什么不能在此时修改此节点的逻辑子节点,因为树步行正在进行中?

我在后台工作线程的已完成方法中设置对象的DataContext。 出于某种原因,我收到一个错误说: 此时无法修改此节点的逻辑子节点,因为正在进行树步行指向Chart1.DataContext = allDates行。 树木行走的意义何在? 我已经尝试使用Dispatcher操作执行此设置,并且出现相同的错误…任何想法? 谷歌在此错误消息上没有任何结果。 代码导致这是微软Charting工具包的内部……我想知道我是否在他们的控制中发现了一个错误… 没有Dispatcher: void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { ArticlesPerTimePeriodResult result = (ArticlesPerTimePeriodResult)e.Result; lvArticles.ItemsSource = result.DatesOfArticles; Chart1.DataContext = result.AllDates; } 使用Dispatcher: void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { ArticlesPerTimePeriodResult result = (ArticlesPerTimePeriodResult)e.Result; lvArticles.ItemsSource = result.DatesOfArticles; Dispatcher.BeginInvoke((Action<List<KeyValuePair>>)(delegate(List<KeyValuePair> allDates) { Chart1.DataContext = allDates; }), result.AllDates); //Chart1.DataContext = result.AllDates; } 错误: System.Reflection.TargetInvocationException […]

BackgroundWorker&Timer,只读取日志文件的新行?

我的应用程序写入一个日志文件(目前使用log4net )。 我想设置一个计时器和一个后台工作程序来读取日志文件并将其内容打印到我的表单中的某个控件中,同时正在编写它。 我无法使用FileSystemWatcher类,因为它看起来很糟糕:有时事件“已更改”会触发,有时则不会。 它具有极低的“汇集率”。 所以我创建了一个Timer和一个FileSystemWatcher。 在计时器的“tick”事件中,后台工作人员完成其工作。 问题是: 如何只读取自上次检查工作人员以来添加的行? public LogForm() { InitializeComponent(); logWatcherTimer.Start(); } private void logWatcherTimer_Tick(object sender, EventArgs e) { FileInfo log = new FileInfo(@”C:\log.txt”); if(!logWorker.IsBusy) logWorker.RunWorkerAsync(log); } private void logWorker_DoWork(object sender, DoWorkEventArgs e) { // Read only new lines since last check. FileInfo log = (FileInfo) e.Argument; // Here is the main […]

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 […]

WPF / C#不要阻止UI

我有一个现有的WPF应用程序,它有几个部分。 每个部分都是UserControl,它实现了一个接口。 该接口指定了两个方法: void LoadData([…])和bool UnloadData() 。 这些方法由UI线程调用,因此如果耗时,我们需要在后台工作中完成我们的工作。 LoadData没有问题,因为我们可以异步更新UI。 问题出在UnloadData()上。 如果我们真的可以离开当前视图,这应该返回。 这是使用当前数据状态(已保存/已修改/无效)计算的: 保存返回true, 无效询问您是否要保留一些正确的数据或不保存而离开 修改后告诉您可以取消更改(返回true),继续编辑(返回false),保存当前数据(返回true) 问题在于“修改 – >保存”。 这是一个耗时的方法,所以为了尊重应用程序的原理,我们应该在后台线程(带忙指示符)中运行它。 但是如果我们只是启动线程并转到下一部分,它将返回“true”到方法调用,我们将直接启动下一个视图。 在我的情况下,在保存本地数据之前加载下一个视图可能是个问题。 所以: 有没有办法在返回“true”之前等待后台线程完成,而不阻止UI? public bool UnloadData(){ if(…){ LaunchMyTimeConsumingMethodWithBackgroundWorker(); return true;//Only when my time consuming method ends } //[…] } 重要的编辑也许我不清楚:我知道如何使用BackgroundWorker或TPL。 我的问题是父类(调用UnloadData()的类是一个我无法编辑的类(由于多种原因:它在另一个不会重新加载的DLL中,它已经与70多个userControl一起工作,所有这些都在单独的项目(dll),由reflection加载。 这不是我的选择,我觉得它不好,但我现在要处理它。 我一直在寻找方法让我的方法等待返回我的方法。 我不确定是否有可能。 但我正在寻找一种解决方法,它将为我节省数周的工作量。

不确定进度条

目前,我有一个按钮,当用户点击它时,它会查找已准备好并包含文件的特定CD-ROM驱动器。 有时,当用户单击按钮时,单击按钮会导致鼠标按下,程序会挂起一段不确定的时间,直到计算机读取CD-ROM驱动器为止。 我做了进度条,但我注意到了一些事情: 1)程序在检查CD驱动器的方法被调用之前挂起/冻结。 因此,我无法设置在调用方法时显示的进度条。 似乎程序在单击按钮时以及用户同时放入CD时挂起。 单击按钮并且鼠标仍然按下/直到系统检测到CD驱动器后,如何显示进度条? 2)我对如何实现Background Worker感到困惑。 我看起来很喜欢的例子,但没有一个匹配MVM(没有代码隐藏)方法的不确定进度条。 3)操作完成后如何使窗口消失? 目前,我有一个取消按钮(绝对没用)。 这是我到目前为止所建立的。 不知道如何继续: 进度条: 我有一个ProgressBarViewModel,其中包含允许用户取消进度窗口的命令。另外,我还有另一个ViewModel,我需要在里面调用progressBar对话框,但我不知道在哪里调用它,因为如果我在里面调用它方法,按钮仍然挂起而不显示进度条。 我注意到如果我在代码隐藏中使用Button_PreviewMouseDown方法,但是,当鼠标关闭并且系统显示进度条但我不想使用代码隐藏时,进度条会正确显示,因为我在另一个视图中有进度条。 目前,对于我的导入按钮,所有附加的命令都是一个调用驱动器搜索CD-ROM驱动器的方法的命令。 MainViewModel: public ICommand ImportCDFilePathCommand { get { return new RelayCommand(ImportCDFilePath, null); } } private void ImportCDFilePath() { // dialogService.ShowDialog(“Progress”, progressBarWindow); x.DriveType == DriveType.CDRom); // Get all the cd roms var cdRoms = allDrives.Where(x=>x.DriveType==DriveType.CDRom && allDrives.Any(y=>y.IsReady)); //…. There […]