编辑: 这个问题看起来可能是同一个问题,但没有回复......
编辑:在测试用例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从未完成.
代码重现:
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) 我正在使用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)
并发生以下情况:"完成"被写入控制台,然后我在调试器中得到异常,然后我按继续我的程序存在.
是什么赋予了?
我有一个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) 我需要通过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请求.
我有一个按钮——当用户点击它时——会发送一封电子邮件。我希望它立即返回并在后台发送电子邮件,而无需在处理电子邮件时阻止 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) async-await ×5
c# ×5
asynchronous ×3
.net ×2
c#-5.0 ×1
email ×1
signalr ×1
smtpclient ×1
winforms ×1