C# 取消postAsync时的ObjectDisposedException

C# 取消postAsync时的ObjectDisposedException,c#,xamarin,async-await,task-parallel-library,dotnet-httpclient,C#,Xamarin,Async Await,Task Parallel Library,Dotnet Httpclient,我的Xamarin应用程序中有以下两个类,用于将图像上载到服务器: 公共类概要API:IDisposable { 公共Uri BaseUri{get;private set;} 私有HttpClientHandler\u messageHandler; 公共配置文件API(字符串baseUri、HttpClientHandler messageHandler) { BaseUri=新Uri(BaseUri,UriKind.Absolute); _messageHandler=messageHan

我的Xamarin应用程序中有以下两个类,用于将图像上载到服务器:

公共类概要API:IDisposable
{
公共Uri BaseUri{get;private set;}
私有HttpClientHandler\u messageHandler;
公共配置文件API(字符串baseUri、HttpClientHandler messageHandler)
{
BaseUri=新Uri(BaseUri,UriKind.Absolute);
_messageHandler=messageHandler;
}
受保护的HttpClient CreateHttpClient()
{
var httpClient=新的httpClient(_messageHandler,true){
BaseAddress=BaseUri
};
返回httpClient;
}
公共异步任务SetProfilePicture(流图片、CancellationToken CancellationToken)
{
使用(var client=CreateHttpClient())
{
使用(var copy=new MemoryStream())
{
图片位置=0;
图片。复制到(复制);
复制。位置=0;
var内容=新的StreamContent(复制);
content.Headers.ContentType=new System.Net.Http.Headers.MediaTypeHeaderValue(“image/png”);
var response=wait client.PostAsync(“post”、内容、取消令牌);
Debug.WriteLine(“完成!”);
}
}
}
公共空间处置()
{
_Dispose();
_messageHandler=null;
}
}
公共类概要文件下载程序
{
静态只读惰性=新惰性(()=>
新配置文件下载程序()
);
公共静态概要文件下载程序实例{
得到{
返回lazy.Value;
}
}
ProfileDownloader(){}
CancellationTokenSource\u上传CancellationSource;
公共异步任务上载映像(流映像)
{
如果(AreProfileAndImageBeingUploaded()){
取消ProfileAndImageUpload();
返回;
}
_uploadCancellationSource=新的CancellationTokenSource();
使用(var ProfileApi=newprofileapi(“http://httpbin.org,新的NativeMessageHandler())
{
var imageTask=ProfileApi.SetProfilePicture(图像,_uploadCancellationSource.Token);
试一试{
等待任务;
_uploadCancellationSource=null;
}捕捉(操作取消例外){
Debug.WriteLine(string.Format(“已取消!:{0}”,例如Message));
}捕获(例外情况除外){
Debug.WriteLine(string.Format(“异常!:{0},{1}”,例如Message,例如Source));
}
}
}
公共图书馆的档案和图像已公开()
{
返回_uploadCancellationSource!=null;
}
公共作废取消配置文件和图像上载()
{
如果(_uploadCancellationSource!=null){
_uploadCancellationSource.Cancel();
_uploadCancellationSource=null;
}
}
}
每当我按下应用程序UI中的按钮时,
UploadImage
方法就会被调用

var image=UIImage.FromFile(“Images/SpongeBob.png”);
使用(var stream=image.ToStream()){
ProfileDownloader.Instance.UploadImage(流);
}
我就是这么做的:

  • 按两次按钮,将调用
    UploadImage
    两次。第一次开始上传时,第二次上传被取消,我得到一个
    TaskCancelledException
  • 我再按两次按钮。第一次启动上载,但第二次导致
    ObjectDisposedException
  • 有人知道为什么会出现2中描述的异常吗。被扔了吗

    更新

    下面是异常的堆栈跟踪。它与
    wait imageTask
    一起抛出

    System.ObjectDisposedException: The object was used after being disposed. at System.Net.WebConnection.EndWrite (System.Net.HttpWebRequest request, Boolean throwOnError, IAsyncResult result) [0x0002c] in //Library/Frameworks/Xamarin.iOS.framework/Versions/8.10.1.64/src/mono/mcs/class/System/System.Net/WebConnection.cs:1071 at System.Net.WebConnectionStream.WriteAsyncCB (IAsyncResult r) [0x00013] in //Library/Frameworks/Xamarin.iOS.framework/Versions/8.10.1.64/src/mono/mcs/class/System/System.Net/WebConnectionStream.cs:458 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000b] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/mcs/class/corlib/System.Runtime.ExceptionServices/ExceptionDispatchInfo.cs:61 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:201 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:170 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:142 at System.Runtime.CompilerServices.ConfiguredTaskAwaitable+ConfiguredTaskAwaiter.GetResult () [0x00000] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:477 at System.Net.Http.HttpClientHandler+c__async0.MoveNext () 0x002f4] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs:344 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000b] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/mcs/class/corlib/System.Runtime.ExceptionServices/ExceptionDispatchInfo.cs:61 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:201 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:170 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:142 at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[System.Net.Http.HttpResponseMessage].GetResult () [0x00000] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:580 at System.Net.Http.HttpClient+c__async0.MoveNext () [0x000a9] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClient.cs:274 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000b] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/mcs/class/corlib/System.Runtime.ExceptionServices/ExceptionDispatchInfo.cs:61 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:201 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:170 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:142 at System.Runtime.CompilerServices.TaskAwaiter`1[System.Net.Http.HttpResponseMessage].GetResult () [0x00000] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:372 at Shared.ProfileApi+c__async0.MoveNext () [0x00114] in /Users/mku/Documents/Private projects/Xamarin/Example/Shared/ProfileApi.cs:46 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000b] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/mcs/class/corlib/System.Runtime.ExceptionServices/ExceptionDispatchInfo.cs:61 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:201 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:170 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:142 at System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:124 at Shared.ProfileDownloader+c__async0.MoveNext () [0x000b1] in /Users/mku/Documents/Private projects/Xamarin/Example/Shared/ProfileDownloader.cs:42 System.ObjectDisposedException:对象在被释放后被使用。在System.Net.WebConnection.EndWrite(System.Net.HttpWebRequest请求,布尔throwOnError,IAsyncResult结果)[0x0002c]中 //Library/Frameworks/Xamarin.iOS.framework/Versions/8.10.1.64/src/mono/mcs/class/System/System.Net/WebConnection.cs:1071位于System.Net.WebConnectionStream.WriteAsyncCB(IAsyncResult r)[0x00013]中 //Library/Frameworks/Xamarin.iOS.framework/Versions/8.10.1.64/src/mono/mcs/class/System/System.Net/WebConnectionStream.cs:458---从引发异常的前一个位置开始的堆栈结束跟踪---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000b]中 /Users/builder/data/lanes/1503/e6ebd18b/source/mono/mcs/class/corlib/System.Runtime.ExceptionServices/ExceptionDispatchInfo.cs:61 at System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(System.Threading.Tasks.Task)[0x00047]中 /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:201 at system.runtime.compilerservices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(system.Threading.Tasks.Task任务)[0x0002e] /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:170 at system.runtime.compilerservices.taskauer.ValidateEnd(system.Threading.Tasks.Task任务)[0x0000b]中 /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:142 at system.runtime.compilerservices.ConfiguredTaskAwaitable+ConfiguredTaskAwaiter.GetResult()[0x00000]in /Users/builder/data/lanes/1503/e6ebd18b/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:477在system.Net.Http.HttpClientHandler+c_uasync0.MoveNext()0x002f4]中 /Users/builder/data/lanes/1503/e6ebd18b/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs:344---从引发异常的前一个位置开始的堆栈结束跟踪---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000b]中 /用户/生成器/数据/
    var image = UIImage.FromFile ("Images/SpongeBob.png");
    using (var stream = image.ToStream ()) {        
        awaProfileDownloader.Instance.UploadImage (stream);
    }