Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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#_Button - Fatal编程技术网

C# “想要”;取消“;停止在c中下载图像的按钮#

C# “想要”;取消“;停止在c中下载图像的按钮#,c#,button,C#,Button,我使用以下代码通过HTTPWebRequest从数据库下载图像 BackgroundWorker bgWorker = (BackgroundWorker)sender; string baseUrl = "http://some path"; int numIterations = 10; for (int i = 0; i < numIterations; i++) { if (bw.CancellationPending == true)

我使用以下代码通过HTTPWebRequest从数据库下载图像

 BackgroundWorker bgWorker = (BackgroundWorker)sender;

 string baseUrl = "http://some path";
 int numIterations = 10;
 for (int i = 0; i < numIterations; i++)
        {
         if (bw.CancellationPending == true)
           {
                e.Cancel = true;
                break;
           }

         else
            {
             HttpWebRequest request = null;
             foreach (var fileName in fileNames)
                   {
                      string url = string.Format(baseUrl, fileName);
                      request = (HttpWebRequest)WebRequest.Create(url);
                      request.Method = "GET";
                      request.ContentType = "application/x-www-form-urlencoded";
                      request.CookieContainer = container;

                      response = (HttpWebResponse)request.GetResponse();
                      Stream stream = response.GetResponseStream();
                      Image img = Image.FromStream(stream);

                      img.Save("some path" + fileName);

                      ZoomThumbnail = img;
                      ZoomSmall = img;
                      ZoomLarge = img;

                      ZoomThumbnail = GenerateThumbnail(ZoomThumbnail, 86, false);

                      ZoomSmall  = GenerateThumbnail(ZoomSmall, 400, false);

                      ZoomLarge = GenerateThumbnail(ZoomLarge, 1200, false);

                      if (img != null)
                      ZoomThumbnail.Save("some path" + fileName + "_Thumb.jpg");
                      ZoomSmall.Save("some path" + fileName + "_ZoomSmall.jpg");
                      ZoomLarge.Save("some path" + fileName + "_ZoomLarge.jpg");
                      System.Threading.Thread.Sleep(200);
                    }
                }

bw.CancelAsync()
行中,我想使用
BackgroundWorker
。我还猜想上面的代码是由后台工作人员执行的

然而,在代码中的任何地方,我都看不出您实际上是在检查是否应该取消该过程。此外,您还可以通过以下方式一次性下载图像:

Image img = Image.FromStream(stream);
这不支持取消。因此,问题是:

  • 您不能取消对所有文件的循环,因为您没有检查是否应取消后台工作程序
  • 您不能取消单个图像下载,因为您是一次性下载的
  • 解决方案:

  • 在循环中,添加在后台工作进程取消时退出循环的条件
  • 更改图像下载,以便获得字节块,在循环中调用它,并在那里检查取消
  • 第一种可能的解决方案:

    if (bw.CancellationPending)
    {
        return;
    }
    
    第二种可能的解决办法:

    Stream stream = response.GetResponseStream();
    byte[] buffer = new byte[512];
    int bytesRead = 0;
    do
    {
        bytesRead = stream.Read(buffer, 0, buffer.Length);
        if (bytesRead > 0)
        {
            // Save the bytes to a memory stream
        }
    }
    while (bytesRead > 0 && !bw.CancellationPending)
    
    if (!bw.CancellationPending)
        img = Image.FromStream(<yourMemoryStream>);
    
    Stream=response.GetResponseStream();
    字节[]缓冲区=新字节[512];
    int字节读取=0;
    做
    {
    bytesRead=stream.Read(buffer,0,buffer.Length);
    如果(字节读取>0)
    {
    //将字节保存到内存流中
    }
    }
    while(bytesRead>0&&!bw.CancellationPending)
    如果(!bw.CancellationPending)
    img=Image.FromStream();
    
    这是wpf、winforms等吗?是的。。我正在使用一个带有两个按钮和一个picturebox的表单。在.net 4.5中,
    有一个新方法
    ReadAsync
    ,带有接受取消令牌的重载。这些重载是
    可等待的
    @Thorsten Dittmar。请检查我在中所做的编辑question@GauravK. 这一变化并不完全。您不仅需要取消迭代,还需要对文件执行
    foreach
    循环,而且根本没有实现从流中的块读取。此外,请不要将解决方案纳入您的问题,否则答案将无效,因为您问题中的代码有效。试一下我在你的项目中提出的建议,看看是否有效。
    Stream stream = response.GetResponseStream();
    byte[] buffer = new byte[512];
    int bytesRead = 0;
    do
    {
        bytesRead = stream.Read(buffer, 0, buffer.Length);
        if (bytesRead > 0)
        {
            // Save the bytes to a memory stream
        }
    }
    while (bytesRead > 0 && !bw.CancellationPending)
    
    if (!bw.CancellationPending)
        img = Image.FromStream(<yourMemoryStream>);