相关疑难解决方法(0)

从异步方法获取结果

我的服务中有这个方法:

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类?

c# asynchronous entity-framework

11
推荐指数
2
解决办法
3万
查看次数

在自定义中间件中测试 response.WriteAsync()

我有一个 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)

c# mstest asp.net-core

9
推荐指数
1
解决办法
2828
查看次数

例外不是冒泡

我试图抓住抛出的异常,但它没有冒泡到它被调用的地方.它突然陷入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)

c# exception-handling try-catch

7
推荐指数
1
解决办法
1713
查看次数

await和Task.Wait之间的区别

第一种方式:

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)

在上述两种方法中,存在任何性能差异吗?

c#

6
推荐指数
1
解决办法
6966
查看次数

即使使用ConfigureAwait,也会在WebAPI死锁中同步调用异步方法(false)

我有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

6
推荐指数
1
解决办法
3361
查看次数

使用 HttpClient 的随机 401 未授权错误

我正在使用 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)

c# asp.net-mvc-4 asp.net-web-api dotnet-httpclient iis-8

6
推荐指数
1
解决办法
9590
查看次数

应该弃用Task.Wait吗?

我学到了从池线程调用Task.Wait会导致线程饥饿死锁的困难方法.

根据这篇MSDN文章,在"死锁"一章中,我们应遵守这两条规则:

  • 不要创建任何同步方法等待异步函数的类,因为可以从池中的线程调用此类.
  • 如果类阻塞等待异步函数,则不要在异步函数内使用任何类.

似乎唯一合法使用Task.Wait的地方是主要功能 - 我在这里夸大了一点,但你明白了.

为什么Task.Wait仍然是.NET框架的一部分,看它有多危险?

.net c# asynchronous task-parallel-library async-await

5
推荐指数
1
解决办法
592
查看次数

无法使用OWIN Self Host关闭并启动新的SignalR

在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)

signalr owin

5
推荐指数
1
解决办法
691
查看次数

HttpClient - 如何判断服务器是否更快停机?

我正在使用.NET HttpClient向我的服务器发送请求.我已将HttpClient.Timeout属性设置为10秒,因此A task was cancelled每当服务器无法在不到10秒的时间内处理我的请求时,我就会收到异常.好到这里.

但是,如果关闭服务器,则需要HttpClient大约20秒才能返回正确的异常,例如图片中的异常.在此输入图像描述

我想看到这个异常超过1​​0秒才能区分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)

.net c# http dotnet-httpclient

4
推荐指数
2
解决办法
2418
查看次数

Task.WaitAsync 与 Task.Wait

我知道Task.Wait()执行它的块线程。

我的理解是否正确,Task.WaitAsync()不这样做?

我试图查找有关它的信息,但没有找到任何信息

.net c# asynchronous task-parallel-library

4
推荐指数
2
解决办法
2705
查看次数