我打算在游戏网站上搜索一些数据.我希望能够发送多个请求,这样我就可以一次屏幕抓取几个页面.我已经通过电子邮件向网站管理员发送电子邮件,并获得了适当的速度(每秒几个请求).
据我所知,BackgroundWorker使用我认为可取的线程池.
将BackgroundWorker用于此用例或使用实际的线程是否有意义?
我见过其他人有类似的问题,但不是我想要的.在backgrounderworker类dowork事件中,我创建了一个新类的实例并调用其中一个函数.以前,我在windows.form.timer tick事件中有这个代码,并且会传递一个委托作为参数之一,它允许函数和它在类中调用的其他函数调用表单上的方法来更新数据网格在GUI上.有没有办法在dowork活动中做到这一点?我需要这个,因为我从dowork调用的函数调用其他函数,我希望每个函数都在GUI数据网格中记录信息.
我正在试图找出处理单击按钮点击触发的后台工作人员的最佳方法.我用3个单选按钮和一个标签创建了一个非常简单的表单.每个单选按钮共享相同的事件radioButton_CheckedChanged.如果事件完成,那么我将标签更新为"完成".如果在事件完成之前单击另一个单选按钮,则将标签更新为已取消.下面是我在这个快速示例中编写的代码.尽管应用程序倾向于按预期运行,但我关注的是使用Application.DoEvents.我有什么替代方案.出于显而易见的原因,我在IsBusy时无法入睡.我是否认为这一切都错了,或者有更好的方法吗?谢谢,poco
private void radioButton_CheckedChanged(object sender, EventArgs e)
{
RadioButton rb = sender as RadioButton;
if (rb.Checked)
{
if (backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
while (backgroundWorker1.IsBusy)
Application.DoEvents();
}
backgroundWorker1.RunWorkerAsync();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 0; i < 100 && !worker.CancellationPending; ++i)
Thread.Sleep(1);
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
label1.Text = "Canceled";
else
label1.Text = "Complete";
}
Run Code Online (Sandbox Code Playgroud) 我的程序中有一个搜索功能,它使用后台工作程序来获得结果.Progress changed事件用于使用新项更新列表视图.
Private Sub SearchWorker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles SearchWorker.ProgressChanged
Dim itmX As ListViewItem
Dim tmpCustomer As CustomerItem
If e.UserState.ToString = "New" Then
lstResults.Items.Clear()
Else
Try
tmpCustomer = e.UserState
itmX = lstResults.Items.Add(tmpCustomer.CustomerName) ' <-- Error here
itmX.Tag = tmpCustomer.CustomerID
itmX.Name = tmpCustomer.CustomerID
itmX.SubItems.Add(tmpCustomer.City)
itmX.SubItems.Add(tmpCustomer.State)
itmX.SubItems.Add(tmpCustomer.Zip)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
progBar.Value = e.ProgressPercentage
Application.DoEvents()
End Sub
Run Code Online (Sandbox Code Playgroud)
我得到了这个错误
An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll
Run Code Online (Sandbox Code Playgroud)
我试过这个,但它并没有什么不同
Private Sub SearchWorker_ProgressChanged(ByVal sender As …Run Code Online (Sandbox Code Playgroud) 我有一个循环,需要创建一个未指定和无限数量的后台线程.然后线程将简单地运行完成,但有些可能需要取消.
我最初计划通过声明一个backgroundWorker,将其添加到列表,然后新建BackgroundWorker以再次开始该过程来完成此操作.但是因为List.Add方法通过引用传入的对象运行,我认为当我新建原始BackgroundWorker时,List引用的线程将丢失(或更糟).
我的第二个想法是简单地将我的newed值赋给数组中的元素(array [i] = new BackgroundWorker()),但这并不适合无限量的线程.
有没有人有任何关于管理这些单独线程的好方法的建议?提前致谢.
我在我的wpf应用程序中使用BackgroundWorker进行线程化.但它使UI挂起,因为我无法点击UI的任何地方.这是我的代码片段:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
Dispatcher.Invoke(new Action(() => ConnectFtp()));
};
worker.RunWorkerAsync();
}
private void ConnectFtp()
{
try
{
int port = string.IsNullOrEmpty(txtport.Text) ? 21 : Convert.ToInt32(txtport.Text);
if (ftpserver1 == null)
{
ftpserver1 = new FtpClient(txtftpserver.Text, port);
ftpserver1.ServerResponse += new EventHandler<FtpResponseEventArgs>(ftpserver2_ServerResponse);
ftpserver1.ClientRequest += new EventHandler<FtpRequestEventArgs>(ftpserver2_ClientRequest);
ftpserver1.TransferProgress += new EventHandler<TransferProgressEventArgs>(ftpserver2_TransferProgress);
ftpserver1.TransferComplete += new EventHandler<TransferCompleteEventArgs>(ftpserver2_TransferComplete);
}
if (!ftpserver1.IsConnected)
{
Run r = new Run("Server1 Status: Resolving address of …Run Code Online (Sandbox Code Playgroud) 我有一个字符串列表,每1000个字符长包含大约20000个字符串.我想使用多个后台工作程序用相同位置的相同字符串的反转版本替换所有这些字符串.
以下是我到目前为止所做的事情:
设置后台工作人员(8因为计算机有8个核心)
for (int j = 0; j < 8; j++)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += DoWork;
worker.RunWorkerCompleted += WorkComplete;
worker.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我不知道在doWork函数中放什么.
dowork函数应该像这样循环:
private void DoWork(object sender, DoWorkEventArgs e)
{
while(list.count > 0)
{
reverse and add to list
}
}
Run Code Online (Sandbox Code Playgroud)
或者doWork函数是否只进行反转,然后将反向字符串传递给WorkComplete函数?
private void DoWork(object sender, DoWorkEventArgs e)
{
reverse string
r.result = reversed string
}
Run Code Online (Sandbox Code Playgroud) 我有一个winforms应用程序,它调用Application.DoEvents().现在,应用程序在调用此方法时会冻结(毫不奇怪).
但是,这只发生在某些机器上.公平地说,这可能是由于机器本身还是仍然是代码/ application.doevents()?在这种情况下,应该重构使用backgroundworker.
这会是机器/环境问题还是使用背景工作者的机会?
我有一个大型CSV文件的解析器类.解析方法逐行读取大文件的工作是在backgroundWorker中完成的.使用该backgroundWorker.ReportProgress方法将完整信息的百分比传递给UI线程,以便表单上的进度条可以完成其任务.这工作正常.
但是,我还想提出一个自定义事件,该事件将从CSV文件第一行获取的字段名列表发送回UI(WPF),以便将它们放在下拉列表中.如果解析器遇到格式错误的线路或其他路障,我还想通过事件通知用户.
我的解析器进程在后台执行只能引发一个事件吗?或者必须将SynchronizationContext.Current从主UI线程传递到我的解析器类,然后使用Post方法?
android中有没有后台工作者!我在这里使用了进度对话框
但没有建议的决心.我需要显示一个等待对话框,在我的流程结束后,执行其他流程.
我在本主题中使用了AsyncTask但我的进度对话框还没有立即显示!!