C# “想要”;取消“;停止在c中下载图像的按钮#
我使用以下代码通过HTTPWebRequest从数据库下载图像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)
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>);