Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对C语言的理解#_C#_Multithreading - Fatal编程技术网

C# 对C语言的理解#

C# 对C语言的理解#,c#,multithreading,C#,Multithreading,我试图实现一个“长等待”对话框,以便在长操作期间在窗口中显示进度条。我知道网上有一些这样的例子。我试图理解为什么我的线程不工作,这样我就可以从中学习一些关于线程的知识 当我运行这个程序时,会发生这样的情况:process.Begin的第1行的断点从未命中。为什么呢 public partial class LongWaitDlg : Window { private ILongWaitProcess process; public LongWaitDlg(ILongWaitPr

我试图实现一个“长等待”对话框,以便在长操作期间在窗口中显示进度条。我知道网上有一些这样的例子。我试图理解为什么我的线程不工作,这样我就可以从中学习一些关于线程的知识

当我运行这个程序时,会发生这样的情况:process.Begin的第1行的断点从未命中。为什么呢

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
接口似乎有缺陷。它要求你做一个忙碌的等待;不断检查是否完成了。它只需要在完成时触发一个事件,或者调用一个回调,或者一个表示完成的
任务