我的服务中有这个方法:
public virtual async Task<User> FindByIdAsync(string userId)
{
this.ThrowIfDisposed();
if (userId == null)
{
throw new ArgumentNullException("userId");
}
return await this.repository.FindByIdAsync(userId);
}
Run Code Online (Sandbox Code Playgroud)
然后在视图中我有这个代码:
using (var service = new UserService(new CompanyService(), User.Identity.GetUserId()))
{
var user = service.FindByIdAsync(id);
}
Run Code Online (Sandbox Code Playgroud)
但用户是任务而不是用户.我尝试添加等待服务调用,但除非当前方法是异步,否则我不能使用await.如何访问User类?
我有一个 ASP.NET Core API,我为它编写了自定义中间件,以便我可以在一个地方处理异常和写入日志。当通过 Kestrel 调试并从浏览器或邮递员提交请求时,中间件按要求工作,但是在我的测试中,响应正文始终是空流。
下面是我编写的中间件类和测试,context.Response.WriteAsync(result) 由于某种原因似乎没有刷新流,但我不知道为什么。有谁能解释一下吗?
using System;
using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using Microsoft.Extensions.Logging;
using System.IO;
namespace APP.API.Middleware
{
public class ExceptionHandler
{
private readonly RequestDelegate request;
private readonly ILogger logger;
public ExceptionHandler(RequestDelegate request, ILogger<ExceptionHandler> logger)
{
this.request = request;
this.logger = logger;
}
public async Task Invoke(HttpContext context)
{
try
{
await request(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private Task HandleExceptionAsync(HttpContext context, Exception ex)
{
HttpStatusCode statusCode = …
Run Code Online (Sandbox Code Playgroud) 我试图抓住抛出的异常,但它没有冒泡到它被调用的地方.它突然陷入InsertNewUser
困境,说道
"PeakPOS.exe中出现类型'System.Exception'的例外,但未在用户代码中处理"
如果我点击调试器继续,它会转到一个被调用的文件,App.g.i.cs
并在我不理解的行上断开,但与休息时的调试有关.该应用程序在此之后终止.
为什么在重新抛出然后重新捕获和处理(待处理)时异常未处理?
AccessViewModel.cs
public void SaveNewUser(Popup popup)
{
UserAccounts.Add(TempUser);
string salt = PeakCrypto.GenerateSalt();
string hash = PeakCrypto.GenerateHashedPassword(Password + salt);
try
{
PeakDB.InsertNewUser(TempUser, salt, hash);
}
catch (Exception e)
{
//TODO notify user that new account could not be saved
}
CreateNewAccount();
if (popup != null)
popup.IsOpen = false;
}
Run Code Online (Sandbox Code Playgroud)
PeakDB.cs
public static async void InsertNewUser(UserAccount user, String salt, String hash)
{
var db = await DatabaseHelper.GetDatabaseAsync();
try
{
using (var userStatement = await db.PrepareStatementAsync( …
Run Code Online (Sandbox Code Playgroud) 第一种方式:
var tds=SearchProcess();
await tds;
public async Task<XmlElement> SearchProcess()
{
}
Run Code Online (Sandbox Code Playgroud)
第二种方式:
var tds= Task.Factory.StartNew(()=>SearchProcess());
Task.WaitAll(tds);
public XmlElement SearchProcess()
{
}
Run Code Online (Sandbox Code Playgroud)
在上述两种方法中,存在任何性能差异吗?
我有nuget包Esri.ArcGISRuntime,我需要在我的一个Web API 2控制器中调用QueryTask.ExecuteAsync方法.没有同步计数器部分所以在我的库c#代码中我使用的是包装器
private QueryResult ExecuteSync()
{
var queryResults = ExecuteAsync();
queryResults.Wait();
return queryResults.Result;
}
private async Task<QueryResult> ExecuteQueryTaskAsync()
{
var queryTask = new QueryTask(_uri);
return await queryTask.ExecuteAsync(_query).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
这在我的程序/服务中完美运行.但是ExecuteSync
在Web API 2控制器中使用这种方式会导致它完全冻结并且永远不会返回响应.
我做了一些研究,并相信罪魁祸首在这里提到:http: //blog.stephencleary.com/2012/07/dont-block-on-async-code.html
我绝对不想异步使用该函数.上面的函数是如此核心并且隐藏在4个包装器的深处,这将是我的库类的一个重大改进,冒泡异步方法只是为了支持这个web api调用.
我正在寻找围绕这个奇怪的Web API行为的解决方案/黑客/建议,以允许我同步运行这个异步方法,而不是让它死锁
c# asynchronous async-await asp.net-web-api asp.net-web-api2
我正在使用 HttpClient 调用 Web Api REST 端点,偶尔我会看到一个随机的 401 未授权状态。
这是我的 HttpClient 包装器,它是为可重用性目的而创建的。我已经修改了它以保持这篇文章的简单而不修改核心部分。
public class HttpHelper
{
public const string JsonContentType = "application/json";
public T PostAsJsonObject<T>(string uri, T t) where T : class
{
using (HttpResponseMessage response = PostJsonHttpRequest(uri, JsonContentType, t))
{
response.EnsureSuccessStatusCode();
return response.Content.ReadAsAsync<T>().Result;
}
}
private HttpResponseMessage PostJsonHttpRequest<T>(string uri, string contentType, T content) where T : class
{
if (String.IsNullOrEmpty(uri))
{
throw new ArgumentNullException("uri");
}
HttpResponseMessage response = CreateHttpClient(contentType).PostAsJsonAsync(uri, content).Result;
return response;
}
private HttpClient CreateHttpClient(string contentType)
{
var …
Run Code Online (Sandbox Code Playgroud) 我学到了从池线程调用Task.Wait会导致线程饥饿死锁的困难方法.
根据这篇MSDN文章,在"死锁"一章中,我们应遵守这两条规则:
似乎唯一合法使用Task.Wait的地方是主要功能 - 我在这里夸大了一点,但你明白了.
为什么Task.Wait仍然是.NET框架的一部分,看它有多危险?
在1.5周的重构结束时,这是一堵墙.
我已经把它降到最低限度,我绝对亏损
我使用owin selfhost(katana)启动SignalR网络服务器,连接到它.我关闭它,然后我启动它并尝试再次连接它.
在第二次通过(第一次工作正常)我尝试启动连接时出错:
public partial class App : Application
{
void App_Startup(object sender, StartupEventArgs e)
{
using (var server = new TestWebServer()) {
server.Start();
using (var hubConnection = new HubConnection(TestWebServer.Host)) {
var proxy = hubConnection.CreateHubProxy("testHub");
hubConnection.Start().Wait();
Debug.Assert(hubConnection.State == ConnectionState.Connected);
}
}
// Makes it here fine
using (var server = new TestWebServer()) {
server.Start();
using (var hubConnection = new HubConnection(TestWebServer.Host)) {
var proxy = hubConnection.CreateHubProxy("testHub");
hubConnection.Start().Wait(); //<-throws "Transport timed out trying to connect"
Debug.Assert(hubConnection.State == ConnectionState.Connected); …
Run Code Online (Sandbox Code Playgroud) 我正在使用.NET HttpClient
向我的服务器发送请求.我已将HttpClient.Timeout
属性设置为10秒,因此A task was cancelled
每当服务器无法在不到10秒的时间内处理我的请求时,我就会收到异常.好到这里.
但是,如果关闭服务器,则需要HttpClient
大约20秒才能返回正确的异常,例如图片中的异常.
我想看到这个异常超过10秒才能区分Server Down和Operation花了太长时间的情况.我在msdn文档中找不到任何相关内容.是否有可以设置的超时HttpClient
?
这是我如何构建的 HttpClient
var webRequestHandler = new WebRequestHandler
{
UseProxy = false,
Proxy = null,
AllowPipelining = false,
ContinueTimeout = TimeSpan.Zero,
UseCookies = false,
AllowAutoRedirect = false,
};
var httpClient = new HttpClient(webRequestHandler);
httpClient.Timeout = timeout;
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "application/json");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", userAgent);
httpClient.DefaultRequestHeaders.ExpectContinue = false;
Run Code Online (Sandbox Code Playgroud) 我知道Task.Wait()
执行它的块线程。
我的理解是否正确,Task.WaitAsync()
不这样做?
我试图查找有关它的信息,但没有找到任何信息
c# ×9
asynchronous ×4
.net ×3
async-await ×2
asp.net-core ×1
http ×1
iis-8 ×1
mstest ×1
owin ×1
signalr ×1
try-catch ×1