【发布时间】:2014-12-08 06:01:42
【问题描述】:
这是我得到的错误:
One or more errors occurred.
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at System.Threading.Tasks.Task`1.get_Result()
at myProject.mymethod(Int32[] myIds) in path\MyClass.cs:line 758
这是那个方法:
private void mymethod(int[] myIds)
{
var uri = new Uri(string.Format(UriPath, string.Format(MyPath)));
var client = GetHttpClient(uri);
var postModel = new PostModel
{
Ids = myIds,
LastUpdate = NewItem ? null : _lastUpdated
};
if (client != null)
{
var response = client.PostAsJsonAsync(uri, postModel).Result;//this line crashes
if (response.IsSuccessStatusCode)
{
//doSomething
}
}
}
我调用了很多这样的方法,除了这个之外,它们都可以工作。当它被击中时,它需要很长时间,然后抛出这个异常。使用所有其他方法都不会发生错误。
这是内部异常:
Inner.System.Threading.Tasks.TaskCanceledException: A task was canceled.
这是我的 GetCLient() 方法:
private HttpClient GetHttpClient(Uri uri)
{
var handler = new HttpClientHandler
{
CookieContainer = CoockieContainer
};
return new HttpClient(handler)
{
BaseAddress = uri
};
}
API 方法如下:
[HttpPost]
public IList<MyModel> MyAPIMethod(PostModel model)
{
List<MyModel> myTranslations;
using (var db = new myEntities(GetDbConnStrByUser(new GetCookies().GetUserName())))
{
myTranslations = db.tblTranslations.Where(it => model.Ids.Contains(it.id)
&& (!model.Update.HasValue || it.update > model.LastUpdate.Value))
.Select(it => new MyModel
{
Id = it.id,
Name = it.name,
Description = it.desc,
LanguageId = it.language_id
}).ToList();
}
return myTranslations.GroupBy(x => new { x.Id, x.LanguageId }).Select(x => x.First()).ToList();
}
可能发生超时。
Fiddler 返回此错误:等待操作超时。
【问题讨论】:
-
不要使用阻塞语句,而是使用异步。查看内部异常。
-
@JeroenVannevel 你所说的阻塞语句是什么意思?
-
对
.Result的调用是同步语句;你永远不会使用你可能拥有的异步性。更多关于正确使用 async-await 的信息:msdn.microsoft.com/en-us/library/hh191443.aspx -
发布整个异常。问题是你只显示“外部”异常,所以我们看不到发生了什么。查看异常的 InnerException 属性,看看到底出了什么问题。
-
你解决过这个问题吗?遇到类似问题