- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个包含 350 个可下载图片 URL 的列表。我通过运行多个任务一次并行下载 10 张图像。但是在下载了 N 个图像后,我的代码突然抛出以下异常。
Exception: "An error occurred while sending the request."
InnerException: "The request was aborted: Could not create SSL/TLS secure channel."
StackTrace: "at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n ...
我创建了一个示例项目 来重现此异常。我手里有 2 个测试用例。可以从My Sky Drive Here下载运行测试工程.右键单击文件 HTTPClientTestCases1and2.zip 并下载。
案例 1:使用单个实例 HttpClient 进行所有图片下载。
在这种情况下,我使用相同的 HttpClient 向 10 个 url 发送并行请求。在这种情况下,大部分时间下载都是成功的。上次成功下载图像后等待至少 40 秒(最多 1 分 40 秒)以发送下一批的下一个并行下载请求。由于此异常,一张图像肯定会失败。但是它写了很多地方并建议使用单个 HttpClient 进行多个请求。
public async void DownloadUsingSingleSharedHttpClient(Int32 imageIndex)
{
Uri url = new Uri(ImageURLs[imageIndex]);
UnderDownloadCount++;
try
{
Byte[] contentBytes = null;
try
{
// Exception IS THROWN AT LINE BELOW
HttpResponseMessage response = await _httpClient.GetAsync(url);
contentBytes = await response.Content.ReadAsByteArrayAsync();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Download Failed at GetAsync() :" + ex.Message);
throw ex;
}
DownloadedCount++;
if (OnSuccess != null)
OnSuccess(this, new DownloadSuccessEventArgs() { Index = imageIndex, Data = contentBytes });
}
catch (HttpRequestException hre)
{
DownloadFailedCount++;
if (OnFailed != null)
OnFailed(hre, null);
}
catch (TaskCanceledException hre)
{
DownloadFailedCount++;
if (OnFailed != null)
OnFailed(hre, null);
}
catch (Exception e)
{
DownloadFailedCount++;
if (OnFailed != null)
OnFailed(e, null);
}
}
案例 2:为每个图片下载创建新的 HttpClient 实例
在这种情况下,由于并行下载图像时出现相同的异常,它会非常频繁地失败。
public async void DownloadUsingCreatingHttpClientEveryTime(Int32 imageIndex)
{
Uri url = new Uri(ImageURLs[imageIndex]);
UnderDownloadCount++;
try
{
Byte[] contentBytes = null;
using (HttpClientHandler _handler = new HttpClientHandler())
{
_handler.AllowAutoRedirect = true;
_handler.MaxAutomaticRedirections = 4;
using (HttpClient httpClient = new HttpClient(_handler))
{
httpClient.DefaultRequestHeaders.ExpectContinue = false;
httpClient.DefaultRequestHeaders.Add("Keep-Alive", "false");
try
{
// Exception IS THROWN AT LINE BELOW
contentBytes = await httpClient.GetByteArrayAsync(url.OriginalString);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Download Failed :" + ex.Message);
throw ex;
}
}
_handler.Dispose();
}
DownloadedCount++;
if (OnSuccess != null)
OnSuccess(this, new DownloadSuccessEventArgs() { Index = imageIndex, Data = contentBytes });
}
catch (HttpRequestException hre)
{
DownloadFailedCount++;
if (OnFailed != null)
OnFailed(hre, null);
}
catch (TaskCanceledException hre)
{
DownloadFailedCount++;
if (OnFailed != null)
OnFailed(hre, null);
}
catch (Exception e)
{
DownloadFailedCount++;
if (OnFailed != null)
OnFailed(e, null);
}
}
请在 MainPage.xaml.cs 中编辑以下函数以检查两种情况
private void Send10DownloadRequestParallel()
{
for (Int32 index = 0; index < 10; index++)
{
Task.Run(() =>
{
Int32 index1 = rand.Next(0, myImageDownloader.ImageURLs.Count - 1);
UpdateDownloadProgress();
// Case 1: Download Using Single Shared HttpClient
// myImageDownloader.DownloadUsingSingleSharedHttpClient(index1);
// OR
// Case 2: Download Using Creating Http Client Every Time
myImageDownloader.DownloadUsingCreatingHttpClientEveryTime(index1);
});
}
}
我的问题:我做错了什么?通过克服此异常在 WinRT 中实现并行下载器的最佳方法是什么。
最佳答案
我运行了您的示例应用程序,但只在几种情况下出现错误:
当您的应用请求的图像不存在时,.NET HTTP 客户端会抛出异常。您的处理程序不能很好地处理这种情况,因为内部异常是 NULL。我不得不稍微调整一下代码:
async void myImageDownloader_OnFailed(object sender, EventArgs e)
{
await App.CurrentDispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, delegate
{
TimeSpan time =(DateTime.Now -dateTimeSuccess);
String timeGap = "Ideal For:" + time.ToString() + "\n";
ErrorListBox.Text += "\n Failed When: " + DownloadInfo.Text + "\n";
ErrorListBox.Text += timeGap;
// CX - added null check for InnerException, as these are NULL on HTTP result status 404
var ex = sender as Exception;
if (ex.InnerException != null)
ErrorListBox.Text += ex.InnerException.Message;
else
ErrorListBox.Text += "Inner Exception null - Outer = (" + ex.ToString() + ")";
});
}
我唯一一次收到您的其他错误无法在 Windows 8 Metro 应用程序中创建 SSL/TLS 安全通道
,是在我使用 HTTP 调试代理 (Fiddler) 时。如果我不使用拦截所有 HTTP(S) 调用的 Fiddler,那么我下载没有问题。我什至开始快速连续地进行多次下载(通过在一秒钟内多次单击蓝色下载区域)。结果是所有项目都已下载(除了 404 错误,如上所述)。
这是成功下载的屏幕截图(404 错误除外)。此屏幕截图正在运行测试用例 #2(HttpClient 的多个实例)。我确实运行了测试用例 #1(HttpClient 的单个实例),结果也成功了。
简而言之,我没有看到您遇到的问题。我唯一能想到的就是让您从不同的机器或位置试用您的应用程序。
关于ssl - 请求被中止 : Could not create SSL/TLS secure channel in Windows 8 Metro App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158069/
假设有一个创建用户的操作。如果存在指定的电子邮件或用户名,此操作可能会失败。如果它失败了,则需要确切地知道原因。在我看来,有三种方法可以做到这一点,我想知道是否有明显的赢家。 所以,这是一个类用户:
var obj1 = Object.create; console.log(typeof obj1); var obj2 = Object.create(null); console.log(type
I am getting this error after running npm run build yield User.create({^在运行NPM Run Build Year Use
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我正在尝试使用 JDBC(最新版本)设置 SQL Server 2008 数据库。 我有一个我想一起执行的 setup sql 命令列表: 基本上我做的是: connection.setAutoCom
我正在尝试创建一个 CloudFormation 模板来创建一个 Auto Scaling 组,以便我可以从中启动 2 个实例。 我已经创建了 Auto Scaling 组,但我不知道如何编写用于从
我正在创建我的第一个WordPress网站。我已经在我的网站上安装了Elementor Pro插件。随之而来的一个有利因素是“循环旋转木马”。。。当我把它添加到我的页面时,一切似乎都在工作,但是当我点
create-react-app error 我从终端运行yarn start时收到此错误消息...我尝试了sudo killall node和许多其他过程来清除i-node却没有成功。 我也将我的c
在 CRM 中,当我尝试设置工作流程时,我可以选择与某个实体的创建时间相关的超时。涉及三个字段。 记录创建于 创建于 修改时间 虽然最后一个很明显,但我看不出其他两个之间有任何逻辑上的区别。 最佳答案
我在一次采访中被问到这个问题。我无法回答。 "browserslist": [ ">0.2%", "not dead", "not ie <= 11", "not op_mini all" ] 我可以
这是一个 Rails 新手问题: 当我在模型上调用 create() 时,它会绕过关联的 Controller create 操作吗? 例如,这没有命中我的标签 Controller #create
我不明白这两种特权之间的区别。 我找到了这两种解释,但对我没有帮助。 CREATE TABLE -> Enables a user to create a table owned by that us
我是 SharePoint 工作流的新手。 创建新任务并分配 TaskId 时,我有两个选项: 创建一个新字段来保存 TaskId 创建一个新属性来保存 TaskId。 新属性是一个依赖属性。 我的问
我突然注意到我们的代码库中有一个TDataModuleTestExchange(nil)“构造函数调用”: procedure TDialoogConfigExchange.ButtonTestCli
我有一个具有 TComponent 变量的单元,我在单元初始化时创建此组件,如下所示: var XComp: TComponent; . . . . initialization begin
Composer 是否提供了更新项目创建时使用的包的方法?即,如果我使用以下内容创建一个新的 Laravel 项目 composer create-project --prefer-dist lara
在 Hibernate 中,如果我们将 hbm2ddl.auto 设置为 create/create-drop ,那么它将在启动时删除旧模式并创建新模式。这意味着,它也会删除数据?..我的疑问是,如果
我使用了 create an Automated Build 中的此链接 ( this guide ) . 浏览器错误控制台显示: https://hub.docker.com/v2/reposito
我已经搜索了 msdn 并没有找到答案。我应该知道有什么区别吗? 如果真的没有区别,那么为什么会存在这种冗余? --SQL Server Stored Procedure Syntax CREATE
我有以下内容: var CardViewModel = function (data) { ko.mapping.fromJS(data, {}, this); this.editin
我是一名优秀的程序员,十分优秀!