相关疑难解决方法(0)

使用await/async时,HttpClient.GetAsync(...)永远不会返回

编辑: 这个问题看起来可能是同一个问题,但没有回复......

编辑:在测试用例5中,任务似乎陷入WaitingForActivation状态.

我在.NET 4.5中使用System.Net.Http.HttpClient遇到了一些奇怪的行为 - 其中"等待"调用(例如)的结果httpClient.GetAsync(...)将永远不会返回.

只有在使用新的async/await语言功能和Tasks API时才会出现这种情况 - 在仅使用continuation时,代码似乎始终有效.

下面是一些重现问题的代码 - 将其放入Visual Studio 11中新的"MVC 4 WebApi项目"中,以显示以下GET端点:

/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- never completes
/api/test6
Run Code Online (Sandbox Code Playgroud)

这里的每个端点都返回相同的数据(来自stackoverflow.com的响应头),除非/api/test5从未完成.

我在HttpClient类中遇到过错误,还是以某种方式滥用了API?

代码重现:

public class BaseApiController : ApiController
{
    /// <summary>
    /// Retrieves data using continuations
    /// </summary>
    protected Task<string> Continuations_GetSomeDataAsync()
    {
        var httpClient = new HttpClient();

        var t = httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead);

        return t.ContinueWith(t1 => t1.Result.Content.Headers.ToString());
    }

    /// <summary>
    /// Retrieves data using async/await
    /// …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous async-await dotnet-httpclient

297
推荐指数
3
解决办法
17万
查看次数

使用void进行异步异常处理

我正在使用Async CTP编写IO重型控制台应用程序.但我遇到异常问题.

public static void Main()
{
   while (true) {
     try{
         myobj.DoSomething(null);
     }
     catch(Exception){}
     Console.Write("done");
     //...
   }
}

//...
public async void DoSomething(string p)
{
   if (p==null) throw new InvalidOperationException();
   else await SomeAsyncMethod();
}
Run Code Online (Sandbox Code Playgroud)

并发生以下情况:"完成"被写入控制台,然后我在调试器中得到异常,然后我按继续我的程序存在.
是什么赋予了?

c# asynchronous exception-handling async-await c#-5.0

10
推荐指数
2
解决办法
1万
查看次数

应该如何处理等待异步任务并在同一方法中显示模态形式?

我有一个Windows窗体应用程序,我在其中使用SmtpClient发送电子邮件.应用程序中的其他异步操作使用async/await,理想情况下,我希望在发送邮件时保持一致.

我在发送邮件时显示一个带取消按钮的模态对话框,并将SendMailAsync与form.ShowDialog组合在一起,因为等待发送会阻塞,所以ShowDialog也是如此.我目前的做法如下,但看起来很乱,有没有更好的方法呢?

private async Task SendTestEmail()
{
  // Prepare message, client, and form with cancel button
  using (Message message = ...)
  {
     SmtpClient client = ...
     CancelSendForm form = ...

     // Have the form button cancel async sends and
     // the client completion close the form
     form.CancelBtn.Click += (s, a) =>
     {
        client.SendAsyncCancel();
     };
     client.SendCompleted += (o, e) =>
     {
       form.Close();
     };

     // Try to send the mail
     try
     {
        Task task = client.SendMailAsync(message);
        form.ShowDialog();
        await task; // Probably redundant …
Run Code Online (Sandbox Code Playgroud)

c# winforms async-await

8
推荐指数
1
解决办法
3832
查看次数

从SignalR集线器发送异步邮件

我需要通过SignalR集线器调用发送电子邮件.我不希望send同步执行,因为我不想绑定WebSocket连接,但是如果可能的话,我希望通知调用者是否有任何错误.我以为我可以在集线器中使用这样的东西(减去错误处理和我希望它做的所有其他事情):

public class MyHub : Hub {
    public async Task DoSomething() {
        var client = new SmtpClient();
        var message = new MailMessage(/* setup message here */);
        await client.SendMailAsync(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

但很快发现它不起作用; client.SendMailAsync调用抛出这个:

System.InvalidOperationException:此时无法启动异步操作.异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动.

进一步的调查和阅读告诉我,SmtpClient.SendMailAsync是围绕EAP方法的TAP包装器,而SignalR不允许这样做.

我的问题是,有没有简单的方法直接从集线器方法发送电子邮件?

或者我唯一的选择是将电子邮件发送到其他地方吗?(例如,让集线器队列成为服务总线消息,然后一个独立服务可以处理这些消息并发送电子邮件[虽然我也有更多的工作来实现结果通知回集中的客户端];或者让集线器向发送电子邮件的Web服务发出HTTP请求.

c# email smtpclient async-await signalr

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

在 C# 中使函数非阻塞/异步的简单方法?

我有一个按钮——当用户点击它时——会发送一封电子邮件。我希望它立即返回并在后台发送电子邮件,而无需在处理电子邮件时阻止 UI。我四处寻找async/ await/etc 并找到了很多不同的方法 - 我正在寻找一个简单的解决方案。我的电子邮件代码:

public void SendEmail(string toAddress, string subject, string body, string code = null) {
    try {

        var fromAddressObj = new MailAddress("noreply@me.com", "Name");
        var toAddressObj = new MailAddress(toAddress, toAddress);
        const string fromPassword = "Password";

        var smtp = new SmtpClient {
            Host = "smtp.office365.com",
            Port = 587,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential(fromAddressObj.Address, fromPassword)
        };
        using (var message = new MailMessage(fromAddressObj, toAddressObj) {
            Subject = subject,
            IsBodyHtml …
Run Code Online (Sandbox Code Playgroud)

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

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