非异步方法,调用异步方法,并且需要处理结果

时间:2018-10-15 13:17:29

标签: c# asp.net api mandrill

我有一个同步的方法和静态类。我必须打电话给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);
    }

但是这行不通,只会停止程序。真的需要帮助。要求更多信息。我真的很难解释自己。

2 个答案:

答案 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。只要任务完成,用户就必须等待。那么为什么我们要异步呢?