为了与线程,代表和后台工作者一起玩,我正在整理一些小应用程序,我对其中一个有点麻烦.我有一个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) 我正在尝试在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# 中,我有两个代码块,它们打开并写入我打开的进程,我希望它们在同一个函数中同时运行。我找到了具有匿名方法的 BackgroundWorker?但是当我试图实现它时,它不会在 lambda 表达式中运行代码。
BackgroundWorker bgwanalysis = new BackgroundWorker();
bgwanalysis.DoWork += delegate
{
...codehere..
};
while (bgwanalysis.IsBusy)
{
Thread.Sleep(2000);
}
Run Code Online (Sandbox Code Playgroud)
我知道我错过了一些基本的东西,有人可以帮我补充吗?谢谢
我一直在使用WPF中的MVVM,并且对于人们有一个快速的问题.现在我有:
我在UserControl中公开了对Grid Properties的访问,但是User Control不知道什么也不与MainWindow交互.
我还有一个我调用ViewModel的类,它为我操作MainWindow/UserControl.我的理解是ViewModel知道View(MainWindow/UserControl)以及如何操作它,而View通常对ViewModel一无所知.
如果我有这个权利,这是我的问题:
当我按下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#制作的应用程序,它使用BackgroundWorker.它将部署到客户端PC.我的问题是,它是否可以在没有多核处理器的计算机上运行(BackgroundWorker)?
或者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) 我很多时候在线程的帮助下调用方法
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) 我想在后台工作程序中创建一个大字节数组.完成工作后,后台工作人员应将数据提供给主线程.
我怎样才能做到这一点?
在我的ASP.NET MVC应用程序中,我将运行后台任务,有时持续约10分钟.我已经阅读了这个主题,看到应用程序域有时会重新启动,从而删除我的线程.
所以我找了一些解决方案.我找到的主要解决方案是Hangfire.我知道它会在失败等情况下重新启动作业,但是他们会以某种方式"绕过"应用程序域重新启动,还是只在这种情况下重新启动作业?
我是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) backgroundworker ×10
c# ×9
wpf ×3
appdomain ×1
asp.net ×1
asp.net-mvc ×1
hangfire ×1
mvvm ×1
threadpool ×1
viewmodel ×1