C# 对C语言的理解#
我试图实现一个“长等待”对话框,以便在长操作期间在窗口中显示进度条。我知道网上有一些这样的例子。我试图理解为什么我的线程不工作,这样我就可以从中学习一些关于线程的知识 当我运行这个程序时,会发生这样的情况:process.Begin的第1行的断点从未命中。为什么呢C# 对C语言的理解#,c#,multithreading,C#,Multithreading,我试图实现一个“长等待”对话框,以便在长操作期间在窗口中显示进度条。我知道网上有一些这样的例子。我试图理解为什么我的线程不工作,这样我就可以从中学习一些关于线程的知识 当我运行这个程序时,会发生这样的情况:process.Begin的第1行的断点从未命中。为什么呢 public partial class LongWaitDlg : Window { private ILongWaitProcess process; public LongWaitDlg(ILongWaitPr
public partial class LongWaitDlg : Window
{
private ILongWaitProcess process;
public LongWaitDlg(ILongWaitProcess process)
{
InitializeComponent();
Progress.Maximum = 1;
Progress.Value = process.IsLiveUpdating() ? 0 : 1;
this.process = process;
Dispatcher.BeginInvoke((Action) (() => this.ManageProgress()));
}
public void ManageProgress()
{
Dispatcher.BeginInvoke((Action)(() => process.Begin()));
while (!Dispatcher.Invoke<bool>(process.IsComplete))
{
double progress = Dispatcher.Invoke<double>(process.GetProgress);
Progress.Value = progress;
Console.WriteLine(progress);
Thread.Sleep(1000);
}
this.Close();
}
}
public分部类LongWaitDlg:Window
{
私有IlongWait过程;
公共LongWaitDlg(ILongWaitProcess流程)
{
初始化组件();
进度。最大值=1;
Progress.Value=process.IsLiveUpdate()?0:1;
这个过程=过程;
Dispatcher.BeginInvoke((操作)(()=>this.ManageProgress());
}
公共工程进度()
{
Dispatcher.BeginInvoke((操作)(()=>process.Begin());
而(!Dispatcher.Invoke(process.IsComplete))
{
double progress=Dispatcher.Invoke(process.GetProgress);
进步。价值=进步;
控制台写入线(进度);
睡眠(1000);
}
这个。关闭();
}
}
您需要在另一个线程中运行操作Dispatcher.BeginInvoke
允许您在主线程上继续执行,但不应使用它启动长时间运行的不间断工作单元,因为这样做将阻止主线程上的所有其他活动,包括对Dispatcher.BeginInvoke
的其他调用,以及使您的UI保持最新所需的响应
注释您的来源,这就是发生的情况:
public void ManageProgress()
{
// This queues up a message to run process.Begin(),
// but will not begin until this function and other callers ahead
// of it have returned control to the Dispatcher
Dispatcher.BeginInvoke((Action)(() => process.Begin()));
// This is waiting on a response from process, but it will get
// stuck in the loop here. Also, using Dispatcher.Invoke<> is suspect here.
// By looping here, we prevent the prior call to BeginInvoke from working.
while (!Dispatcher.Invoke<bool>(process.IsComplete))
{
// ...
}
this.Close();
}
public void ManageProgress()
{
//这会将消息排队以运行process.Begin(),
//但在该函数和前面的其他调用者之前不会开始
//其中一个已经将控制权交给了调度员
Dispatcher.BeginInvoke((操作)(()=>process.Begin());
//这正在等待进程的响应,但它将
//这里陷入了循环中。另外,使用Dispatcher.Invoke在这里是可疑的。
//通过在这里循环,我们可以阻止之前对BeginInvoke的调用工作。
而(!Dispatcher.Invoke(process.IsComplete))
{
// ...
}
这个。关闭();
}
< >不要使用<代码>调度程序.NealNojkK//C>启动您的工作单元,考虑使用任意数量的备选方案,如<代码>系统>任务< /C> >(Acthc/Access in .NET 4.5)、<代码>系统>线程>线程<代码> >或<代码>线程池> QuealUsWorkWorks。所有这些都允许您在主线程之外安排工作,并且您可以从外部(您的工作项)使用Dispatcher.BeginInvoke
来安排对UI的更新,可能是对ManageProcess()
方法的更新版本
您需要在另一个线程中运行操作
Dispatcher.BeginInvoke
允许您在主线程上继续执行,但不应使用它启动长时间运行的不间断工作单元,因为这样做将阻止主线程上的所有其他活动,包括对Dispatcher.BeginInvoke
的其他调用,以及使您的UI保持最新所需的响应
注释您的来源,这就是发生的情况:
public void ManageProgress()
{
// This queues up a message to run process.Begin(),
// but will not begin until this function and other callers ahead
// of it have returned control to the Dispatcher
Dispatcher.BeginInvoke((Action)(() => process.Begin()));
// This is waiting on a response from process, but it will get
// stuck in the loop here. Also, using Dispatcher.Invoke<> is suspect here.
// By looping here, we prevent the prior call to BeginInvoke from working.
while (!Dispatcher.Invoke<bool>(process.IsComplete))
{
// ...
}
this.Close();
}
public void ManageProgress()
{
//这会将消息排队以运行process.Begin(),
//但在该函数和前面的其他调用者之前不会开始
//其中一个已经将控制权交给了调度员
Dispatcher.BeginInvoke((操作)(()=>process.Begin());
//这正在等待进程的响应,但它将
//这里陷入了循环中。另外,使用Dispatcher.Invoke在这里是可疑的。
//通过在这里循环,我们可以阻止之前对BeginInvoke的调用工作。
而(!Dispatcher.Invoke(process.IsComplete))
{
// ...
}
这个。关闭();
}
< >不要使用<代码>调度程序.NealNojkK//C>启动您的工作单元,考虑使用任意数量的备选方案,如<代码>系统>任务< /C> >(Acthc/Access in .NET 4.5)、<代码>系统>线程>线程<代码> >或<代码>线程池> QuealUsWorkWorks。所有这些都允许您在主线程之外安排工作,并且您可以从外部(您的工作项)使用Dispatcher.BeginInvoke
来安排对UI的更新,可能是对ManageProcess()
方法的更新版本
您正在使用Windows窗体吗?如果是这样,您应该在.NET4.5以后的版本中使用BackgroundWorker.或async/await。您的
ILongWaitProcess
接口似乎有缺陷。它要求你做一个忙碌的等待;不断检查是否完成了。它应该只是在完成时触发一个事件,或者调用一个回调,或者一个任务表示其完成。您使用的是Windows窗体吗?如果是这样,您应该在.NET4.5以后的版本中使用BackgroundWorker.或async/await。您的ILongWaitProcess
接口似乎有缺陷。它要求你做一个忙碌的等待;不断检查是否完成了。它只需要在完成时触发一个事件,或者调用一个回调,或者一个表示完成的任务。