首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# HttpClient无需等待响应就可以发布信息

C# HttpClient无需等待响应就可以发布信息
EN

Stack Overflow用户
提问于 2016-03-23 22:05:26
回答 2查看 10.4K关注 0票数 8

我在我的HttpClient web 2应用程序中使用asp.net类向端点发布一些信息。我只想在不等待回复的情况下发布这些信息。这是正确的语法吗?

代码语言:javascript
运行
复制
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://localhost:9000/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    // HTTP POST
    var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
    var response = await client.PostAsJsonAsync("api/products", gizmo);
}
EN

回答 2

Stack Overflow用户

发布于 2016-03-23 22:31:25

我只想在不等待回复的情况下发布这些信息。

在WebAPI中不等待异步方法将导致运行时异常,因为AspNetSynchronizationContext知道任何触发的异步操作。如果它注意到一个控制器操作在异步操作完成之前完成,它将触发所述异常。关于ASP.NET控制器:异步操作尚未完成时完成的异步模块或处理程序中的更多信息

如果您想使用fire并忘记语义,如果您使用的是HostingEnvironment.QueueBackgroundWorkItem 4.5.2和更高版本,则需要通过.NET对委托进行排队。如果没有,则可以使用BackgroundTaskManager

请记住,这种设计并不适合于WebAPI。如果你经常触发这个行动电话,它就不会扩大。如果这种风格经常发生,可以考虑使用更合适的东西,比如message。

票数 4
EN

Stack Overflow用户

发布于 2016-03-23 22:12:10

要在ASP.NET中实现异步任务,请参考以下示例语法:

代码语言:javascript
运行
复制
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            RegisterAsyncTask(new PageAsyncTask(LoadUrlContent));
        }
        catch {}
    }

    protected async Task LoadUrlContent()
    {
        try
        {
        // Add your code here, for example read the content using HttpClient:
        string _content = await ReadTextAsync(YourUrl, 10);
        }
        catch { throw; }
    }

另外,在页面级别设置<%@ Page ... Async="true" %>

下面的示例代码片段显示了HttpClient的用法(从LoadUrlContent()调用此示例函数)

代码语言:javascript
运行
复制
protected async Task<string> ReadTextAsync(string Url, int TimeOutSec)
{
    try
    {
        using (HttpClient _client = new HttpClient() { Timeout = TimeSpan.FromSeconds(TimeOutSec) })
        {
            _client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/html"));
            using (HttpResponseMessage _responseMsg = await _client.GetAsync(Url))
            {
                using (HttpContent content = _responseMsg.Content)
                {
                    return await content.ReadAsStringAsync();
                }
            }
        }
    }
    catch { throw; }
}

您可以修改与特定任务相关的此代码库。

希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36189601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档