C# 尝试从后台工作程序写入GUI中的文本框
我现在花了两个多小时试图解决这个问题,如果有人能帮助我,那将是非常棒的……) 基本上,我尝试的是一个应用程序,它使用LINQ和WebService查询数据库并检索信息 从结果中,我提取了一些信息并将它们写入.CSV文件 除了日志记录之外,一切都很正常 由于我不希望我的UI出现问题,我已经实现了一个后台工作程序: 我将logger文本框交给后台工作人员,由其编写静态webservice方法的进度C# 尝试从后台工作程序写入GUI中的文本框,c#,wpf,multithreading,background,worker,C#,Wpf,Multithreading,Background,Worker,我现在花了两个多小时试图解决这个问题,如果有人能帮助我,那将是非常棒的……) 基本上,我尝试的是一个应用程序,它使用LINQ和WebService查询数据库并检索信息 从结果中,我提取了一些信息并将它们写入.CSV文件 除了日志记录之外,一切都很正常 由于我不希望我的UI出现问题,我已经实现了一个后台工作程序: 我将logger文本框交给后台工作人员,由其编写静态webservice方法的进度 using TextBoxAsAlias = System.Windows.Controls.Text
using TextBoxAsAlias = System.Windows.Controls.TextBox;
在这里,我第一次向logger文本框写信,它工作得绝对完美
private void btnExecute_Click_1(object sender, RoutedEventArgs e)
{
// Register background worker
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
// Flush the content of the logger textbox
txtboxLogger.Clear();
txtboxLogger.AppendText("#########################" + Environment.NewLine);
txtboxLogger.AppendText("# Logger - " + DateTime.Now.ToString("T") + "#" +
txtboxLogger.AppendText("#########################" + Environment.NewLine + Environment.NewLine);
worker.RunWorkerAsync(new Object[] {txtboxLogger });
}
这里是我遇到问题的地方:
如您所见,我再次尝试在DoWork方法中记录一些文本。
问题是,当工人工作完成时,整个文本将被记录下来。
因此,我等待了5分钟,logger文本框中什么也没有发生,一旦完成,所有内容都会立即写入
void worker_DoWork(object sender, DoWorkEventArgs e)
{
Object[] parameter = (Object[])e.Argument;
TextBoxAsAlias textboxLogger = (TextBoxAsAlias)parameter[0];
textboxLogger.Dispatcher.InvokeAsync((Action)(() =>
{
txtboxLogger.AppendText(DateTime.Now.ToString("T") + " - Start processing ... " + Environment.NewLine);
if (isAutoSelection)
{
// Execute Webservice with auto selection
RandomDoWorkMethod(null, context, credential, dateStart, textboxLogger);
}
else
{
// Read în the Numbers + hand it over to the webservice for further computing
RandomDoWorkMethod(ReadInputFile(), context, credential, dateStart, textboxLogger);
}
}));
}
有人知道我如何在后台工作期间立即写入日志文件,而不仅仅是在最后
我在其他方法中进一步使用了以下代码,但结果仍然相同,因为它们都在worker_DoWork线程中
textboxLogger.Dispatcher.InvokeAsync((Action)(() =>
{
))};
提前感谢你的帮助
问候
George像这样使用dispatcher将所有工作推回到UI,您应该只使用dispatcher不时刷新文本,而不要使用dispatcher推送
RandomDoWorkMethod
另外(另请参见
BackgroundWorker
和ProgressChanged
)的说明。使用UI线程的同步上下文
全局变量:
private System.Threading.SynchronizationContext _uiSyncContext;
在构造函数中:
this._uiSyncContext = System.Threading.SynchronizationContext.Current;
在worker_DoWork方法中使用UI元素:
this._uiSyncContext.Post(
delegate(object state)
{
txtboxLogger.AppendText(state as string);
},
"Your Text"
);
您还可以使用Send(同步)方法而不是Post(异步)。这听起来像是使用ProgressChanged事件的标准场景 BackgroundWorker线程不能直接与UI线程通信,但它确实公开了一个可以进行通信的事件。以下是您如何设置的: 在“注册后台工作人员”部分,添加以下行:
worker.WorkerReportsProgress = true;
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
您需要在类中的某个位置定义处理程序,使其看起来像这样:
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage == 0)
{
string message = DateTime.Now.ToString("T") + " - Start processing ... ";
txtboxLogger.AppendText(message + Environment.NewLine);
}
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.ReportProgress(0);
if (isAutoSelection)
{
// Execute Webservice with auto selection
RandomDoWorkMethod(null, context, credential, dateStart, textboxLogger);
}
else
{
// Read în the Numbers + hand it over to the webservice for further computing
RandomDoWorkMethod(ReadInputFile(), context, credential, dateStart, textboxLogger);
}
}
请注意,我们假设进度为0表示我们刚刚开始流程。此值需要在DoWork事件处理程序中发送。因此,您的DoWork方法现在将如下所示:
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage == 0)
{
string message = DateTime.Now.ToString("T") + " - Start processing ... ";
txtboxLogger.AppendText(message + Environment.NewLine);
}
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.ReportProgress(0);
if (isAutoSelection)
{
// Execute Webservice with auto selection
RandomDoWorkMethod(null, context, credential, dateStart, textboxLogger);
}
else
{
// Read în the Numbers + hand it over to the webservice for further computing
RandomDoWorkMethod(ReadInputFile(), context, credential, dateStart, textboxLogger);
}
}
在诊断中使用跟踪