我正在使用同时运行的5个BackgroundWorker对象用于特定目的,并且所有这些对象都必须更改相同的标签.我怎么做?
如何从多个线程修改表单呢?如果我想更改公共字符串,我该怎么做?
从后台工作者加载一切是不是一个坏主意?当前代码在Form_load上执行.我们从webservice中提取了大量数据.一些长期运行的作品是在后台工作者.
无论代码有多小或多大,从背景工作者加载所有东西都是一个坏主意?在后台工作程序中运行的每个函数?或者这会使这个代码变得混乱和踩踏噩梦.
谢谢.
我有一个程序,它使用线程顺序执行耗时的进程.我希望能够监视每个线程的进度,类似于BackgroundWorker.ReportProgress/ ProgressChangedmodel的方式.我不能使用ThreadPool或BackgroundWorker由于我的其他限制.允许/公开此功能的最佳方法是什么.重载Thread该类并添加属性/事件?另一个更优雅的解决方案?
我正在制作一个构建一个巨大的FlowDocument的应用程序.构建FlowDocument所用的时间约为3~4秒.
所以我喜欢在BackgroundWorker中构建FlowDocument,而不是UI线程.但BackgroundWorker无法返回WPF UI对象.(它发生了InvalidOperationException异常.)
我怎么解决这个问题?
我有很多的方法(它们只在一次运行一个虽然),它们都使用相同RunWorkerCompleated和ProgressChanged方法,但它们都具有不同的Dowork方法.执行以下操作是否安全:
private void button_Process_Click(object sender, EventArgs e)
{
bgWork_Process.DoWork += Scrub_DoWork;
bgWork_Process.RunWorkerAsync();
bgWork_Process.DoWork -= Scrub_DoWork;
}
Run Code Online (Sandbox Code Playgroud)
或者我能做到这样的边缘案例?我没有在MSDN上看到任何关于它的信息,说它不被允许,并且它(到目前为止)在我的程序中正常运行,但是我想在这里查看是否有人遇到麻烦这样做.
我想同步调用后台工作程序.我希望执行代码在backgroundworker完成执行时结束.我的BackgroundWorker代码在这里:
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += DoWork;
worker.RunWorkerCompleted += RunWorkerCompleted;
...
worker.RunWorkerAsync();
//wait for execution to end
}
Run Code Online (Sandbox Code Playgroud)
一种方法是再次检查状态,直到执行完成,但有没有其他好的方法呢?
我用一个简单的代码疯狂,我使用BackgroundWorker来自动执行基本操作.我应该向剪贴板添加内容吗?
在BackgroundWorker的方法中执行此代码后:
Clipboard.SetText (splitpermutation [i]);
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,解释线程必须是STA,但我不明白该怎么做.这里有更多代码:(不是全部)
private readonly BackgroundWorker worker = new BackgroundWorker();
private void btnAvvia_Click(object sender, RoutedEventArgs e)
{
count = lstview.Items.Count;
startY = Convert.ToInt32(txtY.Text);
startX = Convert.ToInt32(txtX.Text);
finalY = Convert.ToInt32(txtFinalPositionY.Text);
finalX = Convert.ToInt32(txtFinalPositionX.Text);
incremento = Convert.ToInt32(txtIncremento.Text);
pausa = Convert.ToInt32(txtPausa.Text);
worker.WorkerSupportsCancellation = true;
worker.RunWorkerAsync();
[...]
}
private void WorkFunction(object sender, DoWorkEventArgs e)
{
[...]
if (worker.CancellationPending)
{
e.Cancel = true;
break;
}
else
{
[...]
Clipboard.SetText(splitpermutation[i]);
[...]
}
}
Run Code Online (Sandbox Code Playgroud) 我是线程世界的新手,但我正在研究的应用程序的一些方面要求我使用BackgroundWorker控件来防止UI在执行某些文件操作时冻结.
我要做的是从BackgroundWorker中更新几个表单标签.从来没有使用过这个之前我很快发现我无法访问未在同一个线程中创建的控件,因此经过一些研究后我实现了以下代码,似乎可以使一切工作:
Private Delegate Sub DelegateUpdateStatus(ByVal statusText As String, ByRef currentFile As String)
Private Sub UpdateStatus(ByVal statusText As String, ByVal currentFile As String)
If InvokeRequired Then
Invoke(Sub() LblStatus.Text = statusText)
Invoke(Sub() LblCurrentFile.Text = currentFile)
Else
LblStatus.Text = statusText
LblCurrentFile.Text = currentFile
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
但事情是,我不知道这个代码在做什么,或者为什么需要它.
我做了一些研究,但我没有做过任何真正的工作,我读过的大多数文章都假设了一些先验知识.
我希望了解的三个主要内容:
如上所述,线程仍然是一个非常外国的概念,所以任何简单的英语答案都会非常有用 - 谢谢!
编辑:感谢大家到目前为止的回复.我已经做了一些进一步的阅读,我想知道我是否正确地采用了这种方式.我使用BackgroundWorker的原因是为了确保在我执行文件操作时UI保持响应.问题是,我仍然需要等到BackgroundWorker完成它的工作,所以我可以返回一个指示操作成功的布尔值.有办法解决这个问题,但是从我的阅读中,不得不等待BackgroundWorker完成它的工作就是首先要破坏使用它的目的.那么,阻止UI锁定的最佳方法是什么?
我确信我们都熟悉并且可能使用书籍,在线等提供的大量代码来使用C#读取文件.像......那样简单
StringBuilder fiContents = new StringBuilder();
using (StreamReader fi = new StreamReader(@"C:\a_file.txt"))
{
while (!fi.EndOfStream)
{
fiContents.Append(fi.ReadLine);
}
}
Run Code Online (Sandbox Code Playgroud)
或者可能是......
using (StreamReader fi = new StreamReader(@"C:\a_file.txt"))
fiContents.Append(fi.ReadToEnd());
Run Code Online (Sandbox Code Playgroud)
现在让我们去超级赛亚人片刻做一些真正有趣的东西,比如有一个BackgroundWorker可以让我们显示一个加载图像(我将使用它),提供一个进程倒数计时器或ProgressBar.
public void ReadFile(string filename)
{
BackgroundWorker procFile = new BackgroundWorker();
// Progress 1: If we want to show the progress we need to enable the following property
// procFile.WorkerReportsProgress = true;
profile.DoWork += new DoWorkEventHandler((object obj, DoWorkEventArgs ev) =>
{
StringBuilder fiContents = new StringBuilder();
using (StreamReader fi …Run Code Online (Sandbox Code Playgroud) 我必须使用多个大的二维数组(例如1024 x 128),在我的代码的一部分中,我需要转置一些(最多12个).该过程需要相当长的时间,我试图尽可能加快速度.知道VB.NET支持多线程我在这里和那里读了不同的源,并且可以在主子例程中提出以下代码:
RunXTransposingThreads(Arr1, Arr2, Arr3, ...)
Run Code Online (Sandbox Code Playgroud)
使用BackgroundWorkers作为我的解决方案的一部分:
Private Sub RunXTransposingThreads(ParamArray ArraysToTranspose() As Array)
Dim x = CInt(ArraysToTranspose.GetLength(0)) - 1
Dim i As Integer
For i = 0 To x
Dim worker As New System.ComponentModel.BackgroundWorker
AddHandler worker.DoWork, AddressOf RunOneThread
AddHandler worker.RunWorkerCompleted, AddressOf HandleThreadCompletion
worker.RunWorkerAsync(ArraysToTranspose(i))
Next
End Sub
Private Sub RunOneThread(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
Dim Transposed(,) As Single = Array.CreateInstance(GetType(Single), 0, 0) ' I need this to be like that in order to use other …Run Code Online (Sandbox Code Playgroud) vb.net multithreading backgroundworker multidimensional-array