Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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#BackgroundWorker在导入文件时不报告进度?_C#_Wpf_Multithreading_Backgroundworker - Fatal编程技术网

为什么C#BackgroundWorker在导入文件时不报告进度?

为什么C#BackgroundWorker在导入文件时不报告进度?,c#,wpf,multithreading,backgroundworker,C#,Wpf,Multithreading,Backgroundworker,我是多线程新手,需要帮助。我试图使用C#(WPF codebehind)中的BackgroundWorker来更新进度(通过标签内容),同时通过二进制读取器导入文件。问题是我需要完整的文件才能继续执行程序。因此,我需要知道它什么时候完成 我试图在while循环中锁定主线程,直到布尔标志为true为止,但是ProgressChanged和RunWorkerCompleted方法永远不会到达,并且在读取字节后,主线程似乎被锁定在while循环中。你能建议在这种情况下最好的方法是什么吗?下面是我的代码

我是多线程新手,需要帮助。我试图使用C#(WPF codebehind)中的BackgroundWorker来更新进度(通过标签内容),同时通过二进制读取器导入文件。问题是我需要完整的文件才能继续执行程序。因此,我需要知道它什么时候完成

我试图在while循环中锁定主线程,直到布尔标志为true为止,但是ProgressChanged和RunWorkerCompleted方法永远不会到达,并且在读取字节后,主线程似乎被锁定在while循环中。你能建议在这种情况下最好的方法是什么吗?下面是我的代码。谢谢

全球宣言:

List<byte> storage_list = new List<byte>();
byte[] storage_byte_array = { (byte)0 };
bool Completed_Flag = false;
读取文件:

 byte[] Read_File(string directory_path)
 {
        Completed_Flag = false;
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += worker_DoWork;
        worker.ProgressChanged += worker_ProgressChanged;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        worker.RunWorkerAsync(directory_path);

        while (Completed_Flag == false)
        {
            System.Threading.Thread.Sleep(100);
        }
        return storage_byte_array;
   }

    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        storage_byte_array = storage_list.ToArray();
        Completed_Flag = true;
    }

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        LBL.Content = e.ProgressPercentage;
        Console.WriteLine(e.ProgressPercentage);
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        string filename = (string)e.Argument;
        FileStream stream = File.OpenRead(@filename);
        var length = stream.Length;
        var position = 0;
        var buffer = new byte[1024];
        BinaryReader binReader = new BinaryReader(stream);

        while (position < length)
        {
            int store = binReader.Read(buffer, 0, buffer.Length);
            position = position + store;
            for (int i = 0; i < buffer.Length; i++)
            {
                storage_list.Add(buffer[i]);
            }
            int progressPercentage = Convert.ToInt32(((double)position / length) * 100);

            (sender as BackgroundWorker).ReportProgress(progressPercentage);
        }
        e.Result = storage_list;
    }
byte[]读取文件(字符串目录路径)
{
完成的_标志=假;
BackgroundWorker工人=新的BackgroundWorker();
worker.WorkerReportsProgress=true;
worker.DoWork+=worker\u DoWork;
worker.ProgressChanged+=worker\u ProgressChanged;
worker.RunWorkerCompleted+=worker\u RunWorkerCompleted;
worker.RunWorkerAsync(目录路径);
while(Completed_Flag==false)
{
系统线程线程睡眠(100);
}
返回存储字节数组;
}
void worker\u RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
storage_byte_array=storage_list.ToArray();
完成的_标志=真;
}
void worker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
LBL.含量=e.百分比;
控制台写入线(如百分比);
}
无效工作线程(对象发送器,工作线程目标)
{
字符串文件名=(字符串)e.参数;
FileStream-stream=File.OpenRead(@filename);
变量长度=流长度;
var位置=0;
var buffer=新字节[1024];
BinaryReader=新的BinaryReader(流);
while(位置<长度)
{
int store=binReader.Read(buffer,0,buffer.Length);
位置=位置+存储;
for(int i=0;i
来自:

“对ReportProgress方法的调用是异步的,并返回 立即。ProgressChanged事件处理程序在线程上执行 这就产生了后台工作人员。”

大概是因为你在这里忙着等待主线程

while (Completed_Flag == false)
{
   System.Threading.Thread.Sleep(100);
}
。。。对
ReportProgress()
的调用永远没有机会执行。按照您设计的方式,它基本上是在执行同步操作,那么为什么还要麻烦后台工作人员呢?

来自:

“对ReportProgress方法的调用是异步的,并返回 立即。ProgressChanged事件处理程序在线程上执行 这就产生了后台工作人员。”

大概是因为你在这里忙着等待主线程

while (Completed_Flag == false)
{
   System.Threading.Thread.Sleep(100);
}

。。。对
ReportProgress()
的调用永远没有机会执行。按照您设计的方式,它基本上是在执行同步操作,那么为什么还要麻烦使用BackgroundWorker呢?

C#中多线程的第一条规则:不要使用
BackgroundWorker
@dymanoid来给出这是为什么的链接:)@Dbuggy,从开始并继续。C#中多线程的第一条规则:不要使用
Backgroundworker
@dymanoid Care来提供一个链接,说明这是为什么?:)@Dbuggy,从开始并继续。我接受了您的建议,在单独的线程上实现了主代码。我设法通过一个Dispatcher.Invoke持续写入百分比:
LBL.Dispatcher.Invoke(新操作(()=>LBL.Content=progressPercentage.ToString())我接受了你的建议,在一个单独的线程上实现了主代码。我设法通过一个Dispatcher.Invoke持续写入百分比:
LBL.Dispatcher.Invoke(新操作(()=>LBL.Content=progressPercentage.ToString())