我有一个同步的方法和静态类。我必须打电话给Mandrill并使用结果。
我的方法,看起来像这样
MainForm
我需要result.Result。我无法使我的方法异步。
那么有什么方法可以得到result.Result并在新方法中使用它?
我正在考虑做
public static void MyMethod(Association association , Person p)
{
MandrillApi mandrill = new MandrillApi(mandrillAPIKey);
var mail = GetMandrillMessage(fromEmail, clubAdmin.ProfileInfo.Email);
mail.AddGlobalVariable("Key", value);
mail.AddGlobalVariable("Key", value);
mail.AddGlobalVariable("AssociationBaseUrl", SettingsHelper.GetSetting("AssociationBaseUrl"));
mail.AddGlobalVariable("Key", value);
mail.AddGlobalVariable("UserFirstname", clubAdmin.Firstname);
mail.Subject = "Subject goes here";
var messageRequest = new SendMessageTemplateRequest(mail, "template");
var result = mandrill.SendMessageTemplate(messageRequest);
}
但是这行不通,只会停止程序。真的需要帮助。要求更多信息。我真的很难解释自己。
答案 0 :(得分:0)
您遇到了僵局。从同步代码中调用异步代码的正确等待时间是使整个调用堆栈(从控制器的action方法开始)是异步的。 IMO不这样做是不合理的约束。
更改:
MyMethod
返回Task
而不是void
,以便可以等待async
添加到MyMethod
await
以等待来自IMandrilApi.SendMessageTemplate
的结果MyMethod
重命名为MyMethodAsync
,不是必需的,但它遵循公认的命名约定Task
。如果控制器正在返回内容,则返回Task<T>
,其中T
是当前的返回类型。await
的{{1}}结果MyMethodAsync
控制器方法
我必须假设此代码,但您在注释中确实声明了调用堆栈为controller→MyMethod。另外请注意,仅显示了问题的相关部分,而我没有其他要继续的信息。
public static async Task MyMethodAsync(Association association , Person p)
{
/* your existing code has been removed for brevity as there are no changes in that code */
var result = await mandrill.SendMessageTemplate(messageRequest);
}
答案 1 :(得分:-1)
您可以将方法放在Task
上,然后await
上
public static object MyMethod(Association association , Person p)
{
MandrillApi mandrill = new MandrillApi(mandrillAPIKey);
var mail = GetMandrillMessage(fromEmail, clubAdmin.ProfileInfo.Email);
mail.AddGlobalVariable("Key", value);
mail.AddGlobalVariable("Key", value);
mail.AddGlobalVariable("AssociationBaseUrl", SettingsHelper.GetSetting("AssociationBaseUrl"));
mail.AddGlobalVariable("Key", value);
mail.AddGlobalVariable("UserFirstname", clubAdmin.Firstname);
mail.Subject = "Subject goes here";
var messageRequest = new SendMessageTemplateRequest(mail, "template");
var result = mandrill.SendMessageTemplate(messageRequest);
return result;
}
[HttpPost]
public async Task<HttpResponseMessage> Post([FromBody]MyObject obj)
{
var task = Task.Run(() => MyMethod(a,p));
var result = await task;
return Request.CreateResponse(...);
}
但是控制器中的async
不能使用户体验async
。只要任务完成,用户就必须等待。那么为什么我们要异步呢?