我计划在我的.net网站上使用BackgroundWorker,每晚12点进行一些数据库维护.让asynch进程监控时间并执行操作是一个好主意吗?我使用sql server express edition,所以我不能在数据库端使用任何调度.我也不想使用Windows任务调度程序
任何人都可以解释委托和BackgroundWorker之间的区别吗?在哪种情况下,Backgroundworker比Delegate更有效?因为我们有异步委托,所以需要使用BackGroungWorker.
我有一个VB.net项目,它使用后台工作程序来做一些事情.
现在我想扩展项目,以便能够做多个东西:)
用户可以在文本框中输入URL,当用户单击解析按钮时,程序会创建一个新的tabcontrol,输出一些数据.
我为此使用了一个硬编码的后台工作者.
但现在我想运行多个后台工作人员来完成这些工作,所以我不能依赖硬编码后台工作人员.
是否可以动态创建后台工作程序.
我只是不知道如何设置它,因为我认为我需要设置不同的方法和变量,如:
Private bw As BackgroundWorker = New BackgroundWorker
bw.WorkerReportsProgress = True
bw.WorkerSupportsCancellation = True
AddHandler bw.DoWork, AddressOf bw_DoWork
AddHandler bw.ProgressChanged, AddressOf bw_ProgressChanged
AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted
bw.RunWorkerAsync()
Run Code Online (Sandbox Code Playgroud)
Private Sub bw_DoWork(),Private Sub bw_RunWorkerCompleted()和Private Sub bw_ProgressChanged()
我想我需要在某种数组中声明后台worker如变量(list/ dictionary)??? 除此之外,我不知道如何解决这个问题.
这就是发生的事情:在我的应用程序的表单加载中,我创建了一个后台工作器来绑定控件上的集合(数据库中记录填充到数据集中的记录)。但是问题是当我更新数据库上的记录时,如果我再次运行此过程,则会引发错误。
If xControl.InvokeRequired Then
Dim MyDelegate As New InitializeDataBinding_Delegate(AddressOf InitializeDataBinding)
Invoke(MyDelegate, New Object() {xControl, xQuery, xPrimaryKey}) ' ERROR HERE SAYING: Collection was modified; enumeration operation may not execute.
Else
Using ds As DataSet = New DataSet()
Using dbAdapter As MySqlDataAdapter = New MySqlDataAdapter(xQuery, ConnectionClass.ConnectionString)
dbAdapter.Fill(ds)
End Using
Dim dvm As DataViewManager = New DataViewManager(ds)
Dim iDataList As DataView = dvm.CreateDataView(ds.Tables(0))
For Each iBind As Binding In xControl.DataBindings
xControl.DataBindings.Remove(iBind)
Next
xControl.DataBindings.Add("EditValue", iDataList, xPrimaryKey)
xControl.Properties.DataSource = iDataList
xControl.EditValue = Nothing …Run Code Online (Sandbox Code Playgroud) 我有一个UI按钮,可以生成BackgroundWorker.此BackgroundWorker生成几个执行某些操作的BackgroundWorkers.有没有办法等待所有内部BackgroundWorkers在主BackgroundWorker中完成?
我想UDPListener在后台运行它:
// launch this in a background thread
private static void UDPListen()
{
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0)
using( var udpClient = new UdpClient(10000))
{
while (true)
{
var buffer = udpClient.Receive(ref remoteEndPoint);
var loggingEvent = System.Text.Encoding.Unicode.GetString(buffer);
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以把它放在一个Task.Run()并在while()循环中运行吗?
我已经成功地完成了我BackgroundWorker的工作WinForm.它工作正常,但实际上它没有.从下面可以看出,我的形式有一个listbox以及一个Progress Bar.我正在使用它们来显示在一个文件中写一个收件人列表的进度for loop.我知道这个过程运行得太快了.每次写入一行时,都会listbox显示" 添加x个y收件人 "消息并删除其自身的最后一个条目,以便不会有太多文本.还有每个插入物,progress bar必须迈出一步.

当我在每次写入中添加1ms延迟时,程序工作正常Thread.Sleep(1).我的表单仍然可以在桌面上移动,表单看起来很正常.但是当我删除这个睡眠时(这是真实场景),表单会冻结,就好像我从未使用过并行BackgroundWorker开始一样.我怎样才能克服这个问题?
以下是我的BackgroundWorker DoWork()和ProgressChanged()事件:
做工作:
private void backgroundWorkerConvertDatatableToFile_DoWork(object sender,
DoWorkEventArgs e)
{
try
{
StringBuilder sb = new StringBuilder();
IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().
Select(column => column.ColumnName);
sb.AppendLine(string.Join(GetDelimiter(campaignOutputFormat), columnNames));
backgroundWorkerConvertDatatableToFile.ReportProgress(-1,
dt.Rows.Count.ToString() + " recipients found.");
for (int i = 0; i < dt.Rows.Count; i++)
{
IEnumerable<string> fields = dt.Rows[i].ItemArray.Select(
field => field.ToString());
sb.AppendLine(string.Join(GetDelimiter(campaignOutputFormat), fields));
backgroundWorkerConvertDatatableToFile.ReportProgress(i, …Run Code Online (Sandbox Code Playgroud) 我听说应用程序中有许多线程用于获得最佳性能.我听说当线程数量增加时,性能会提高到一点,之后会开始减少.而对于Android应用程序,限制就像3或4.
有人能解释一下吗?
目前我正在开发一个C#独立应用程序,在那里我使用了大约50个后台工作者.这对系统的性能有何影响?
首先,我在SO和网络上看到了很多类似的问题.这些似乎都没有解决我的特定问题.
我有一个简单BackgroundWorker的工作是逐行读取文件并报告进度以指示它有多远.文件中总共有65,553行,因此BackgroundWorker尽可能快地完成对我来说很重要.
由于MVVM建立在关注点分离(SoC)和视图和视图模型的分离之上BackgroundWorker,因此View绑定的View-Model上的更新属性.我的设置与Kent Boorgaart在另一个问题上的答案非常相似.
在BackgroundWorker需要大量CPU而不会休眠的高压力情况下,UI线程缺乏并且无法更新已通过通知的任何绑定属性INotifyPropertyChanged.但是,如果BackgroundWorker睡觉,那么工作将无法尽快完成.
在View-Model中,这样BackgroundWorker设置.该Start()函数由RelayCommand(MVVM-Light的一部分)调用.
public void Start(string memoryFile)
{
this.memoryFile = memoryFile;
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += Worker_DoWork;
worker.ProgressChanged += Worker_ProgressChanged;
worker.WorkerReportsProgress = true;
worker.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
以下是执行的实际工作的代码:
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = (BackgroundWorker)sender;
IsAnalyzing = true;
bw.ReportProgress(0, new ProgressState("Processing..."));
int count = File.ReadLines(memoryFile).Count();
StreamReader …Run Code Online (Sandbox Code Playgroud) 以下是我正在研究的类的一个简化版本(WinForms项目的一部分):
class ReportBuilder {
private List<Project> projects;
private List<Invoice> invoices;
private MyAPI apiObject;
public ReportBuilder(MyAPI apiAccess, List<Project> selectedProjects){
this.apiObject = apiAccess;
this.projects = selectedProjects;
}
public void DownloadData(){
BackgroundWorker workerThread = new BackgroundWorker();
workerThread.DoWork += (sender, e) => this.retrieveInvoices(this.projects); // yes, the parameter is unnecessary in this case, since the variable is in scope for the method anyway, but I'm doing it for illustrative purposes
workerThread.RunWorkerCompleted += receiveData;
workerThread.RunWorkerAsync();
}
private void retrieveInvoices(List<Project> filterProjects){
Notification status;
if (filterProjects == null){this.invoices …Run Code Online (Sandbox Code Playgroud) backgroundworker ×10
c# ×7
vb.net ×3
.net ×2
data-binding ×2
wpf ×2
async-await ×1
asynchronous ×1
autocomplete ×1
delegates ×1
listbox ×1
log4net ×1
mvvm ×1
winforms ×1