我有一个小应用程序读取管道分隔文件并将行写入RTB,突出显示某些"列"中是否有不允许的字符.这是完美的工作......然而,用户想要一个进度条,并看到"现场"写的行,也能够在中途取消.
我有以下扩展方法,我一直用来写入RichTextBox,同时阻止UI,但这使用BackgroundWorker与BeginInvoke失败.
失败是找到文本的当前长度.
public static void AppendLine(this RichTextBox richTextBox, string text, List<Char> foundChars, List<int> columns)
{
var split = text.Trim().Split(new char[] { '|' });
for (int i = 0; i < split.Count(); i++)
{
**var start = richTextBox.TextLength;**
richTextBox.AppendText(split[i]);
var end = richTextBox.TextLength;
if (columns.Contains(i + 1))
{
foreach (var foundChar in foundChars)
{
var current = start;
while (current > 0)
{
var position = richTextBox.Find(new char[] { foundChar }, current, end);
current = position + 1;
if (current …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写运行BackgroundWorker执行耗时操作的进程的应用程序的一部分.在主线程中,计时器更新进度条(这是此问题的延续).但是,此代码显示没有MessageBoxes.foreach (String word in this.words)在SearchButton_Click事件处理程序中的行上设置断点显示this.words没有值,即this.words.Count() == 0.
public partial class Form1 : Form
{
System.Windows.Forms.Timer searchProgressTimer;
List<String> words;
public Form1()
{
InitializeComponent();
words = new List<String>(3);
}
private void SearchDatabase_Click(object sender, EventArgs e)
{
this.searchProgressTimer.Start();
SearchBackgroundWorker.RunWorkerAsync();
foreach (String word in this.words) // BREAKPOINT HERE
MessageBox.Show(word);
}
private void SearchBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Time-consuming operation
String filename = @"http://www.bankofengland.co.uk/publications/Documents/quarterlybulletin/qb0704.pdf";
WebClient webClient = new WebClient();
webClient.DownloadFileAsync(new …Run Code Online (Sandbox Code Playgroud) 这是我到目前为止所尝试的:
放入button.Visible = false我的表单的初始化程序,并button.Visible = true结束我的backgroundWorkers的DoWork事件.
这会导致程序在BackgroundWorker完成其工作后冻结.
我不明白为什么.
放入button.Visible = false我的表单的初始化程序并button.Visible = true在我的backgroundWorker1.RunWorkerAsync()调用之后.
这不能正常工作,因为它在BackgroundWorker开始工作后立即显示按钮.
我明白为什么会这样.
button.Visible = false与doneEvent = new AutoResetEvent(false)入我的窗体的初始化,然后把doneEvent.WaitOne()和button.Visible = true我的后backgroundWorker1.RunWorkerAsync()调用.我的Backgroundworker从路径中检索和计算,我需要返回一个字符串数组和一个double数组。如何将它们打包在一起?我知道返回一个结果是这样的:
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
int result = 2+2;
e.Result = result;
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
int result = (int)e.Result;
MessageBox.Show("Result received: " + result.ToString());
}
Run Code Online (Sandbox Code Playgroud)
我也尝试使用元组,但我的软件无法识别它,我使用的是 C# 2008 快速版。
如何将两种不同类型的数组打包在一起?
我正在尝试在后台工作进程中更改表单上的标签但是它表示未处理的异常.我看了一下这个错误,它说要像接受的答案那样调用它:在后台工作者winforms中更新标签文本
我已经成功地改变了复选框列表中的值,但是我使用了相同的方法,并且对于它不会调用的标签,我在键入时在代码中得到红色错误行.
我的背景工作者:
private void bw2_DoWork(object sender, DoWorkEventArgs args)
{
BackgroundWorker worker = sender as BackgroundWorker;
func.sshConnect();
for (int num = 0; num < checklist.Items.Count; num++)
{
if (checklist.GetItemChecked(num))
{
string project = checklist.Items[num].ToString();
lblStatus.Text = "Opening " + project + "..."; //error here
if (func.svnCheckoutProject(project))
{
lblStatus.Text = project + " Opened"; //same error here
func.sshRunCommand("echo " + project + " >> " + Properties.Settings.Default.serverUserFilesPath + Properties.Settings.Default.Username);
}
else
{
//error message
}
}
worker.ReportProgress(num * (100 / …Run Code Online (Sandbox Code Playgroud) 我已经在这个主题上搜索了几天,但我没有遇到任何似乎相关的东西。请记住,我仍在学习如何在 C# 中使用 BackgroundWorker 和多线程。
我在使用 ReportProgress 方法时遇到问题。这是我正在做的一个小例子。
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
if (!backgroundWorker1.CancellationPending)
{
// bunch of code for handling a multiple-page PDF file using Ghostscript.NET
for (var pageNumber = 1; pageNumber <= pageCount; pageNumber++)
{
if (!backgroundWorker1.CancellationPending)
{
// get file path and file name, convert page to image file
// after converting page to image file do:
backgroundWorker1.ReportProgress(pageNumber); // Here is the problem
}
else
e.Cancel = true;
...
}
}
}
private void …Run Code Online (Sandbox Code Playgroud) 在组件中,同时加载列表视图和所有内容。
是否可以在后台运行一个函数以每隔几分钟重新加载列表视图数据?
如果是,当用户离开组件(转到另一个选项卡,iOS)时,该功能会停止吗?
我一直在阅读和学习 .Net Core 3.0 中提供的新 Worker Service 功能。我一直在使用 Microsoft 的此链接:后台任务与 ASP.NET Core 中的托管服务
我不明白的是,这些工作服务概念可以引入到现有的 ASPNET Web 项目中,例如 Razor Pages 站点吗?或者您必须创建一个新项目,然后使用主机操作系统为此提供的任何机制将该项目部署为服务?
我有一个需要几秒钟才能加载的应用程序(大量初始化)。GUI 在启动期间冻结。所以我想创建一个在应用程序加载时淡入淡出的启动画面。我使用TBackgroundWorker组件在后台线程中执行动画。
但是,当我使用这个组件时会发生一些奇怪的事情:当它发出“工作完成”的信号时(请参阅 BackgroundWorkerWorkComplete),同时我打开的消息对话框会自动关闭。
procedure TMainForm.ButtonStartSplashClick(Sender: TObject);
VAR
frmSplash: TfrmSplash;
begin
frmSplash:= TfrmSplash.Create(NIL);
frmSplash.StartAnimation;
//MessageBox(Handle, 'Hi', nil, MB_OK); // This remains on screen
Application.MessageBox(PChar('Hi'), PChar('Box'), MB_ICONINFORMATION); // This is automatically closed when the background thread is done
end;
Run Code Online (Sandbox Code Playgroud)
这是启动画面:
procedure TfrmSplash.StartAnimation;
begin
Show;
BackgroundWorker.Execute;
end;
procedure TfrmSplash.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
procedure TfrmSplash.BackgroundWorkerWork(Worker: TBackgroundWorker);
VAR i: Integer;
begin
for i:= 1 to 255 DO
begin
AlphaBlendValue:= i; // do not access GUI directly from …Run Code Online (Sandbox Code Playgroud) 我在 .NET Core Worker Service 中遇到了一些依赖注入问题。请参阅Program.cs文件中的以下代码。
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsof)t", LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.File(@"C:\MyApp_Log\Log.txt")
.CreateLogger();
try
{
Log.Information("Starting up the service.");
CreateHostBuilder(args).Build().Run();
return;
}
catch (Exception ex)
{
Log.Fatal(ex, "There was a problem starting the service");
return;
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
services.AddScoped<IMyAppCoreService, MyAppCoreService>();
services.AddDbContext<MyAppCSContext>(options => options.UseSqlServer("Data Source=xx.xxx.xx.xxx;Database=Mydb;User ID = sa;Password=mypassword"));
services.AddHostedService<Worker>();
})
.UseSerilog();
}
Run Code Online (Sandbox Code Playgroud)
请参阅下面的Worker.cs …
backgroundworker ×10
c# ×7
winforms ×4
.net-core ×2
asp.net-core ×2
.net ×1
delphi ×1
javascript ×1
react-native ×1
return ×1
richtextbox ×1
tform ×1
web-worker ×1