如何为异步和同步方法共享相同的接口?

时间:2016-04-12 19:21:43

标签: c# .net asynchronous interface win-universal-app

我目前正在开发2个应用程序,一个.NET 2.0 winforms应用程序和一个UWP应用程序。大多数类都在两个应用程序中共享。

我有一个名为IDialogService的接口,它有一个特定于.NET2的具体类和另一个UWP的具体类。 IDialogService公开了一个名为ShowDialogYesNo()的方法,该方法根据用户点击的内容返回boolean

问题在于,UWP中的MessageDialog采用ShowAsync方法,而不仅仅是同步Show方法。因此,我无法使用相同的签名来展示MessageBoxMessageDialog

两个项目共享的一些类使用IDialogService的实例。但由于显示对话框的UWP版本需要为async,因此我无法使用ShowDialogYesNo()中的IDialogService方法。

我们使用依赖注入将.NET2或UWP实例注入构造函数。我的目标是为.NET2和UWP提供不同的代码库。

每个平台的接口的具体类实现只会有所不同。如果可能的话,我也不想在我的代码中加入一堆#if WINDOWS_UWP

以下是代码:

  public interface IDialogService
  {
    bool ShowDialogYesNo();
  }

  public class DialogServiceNet2 : IDialogService
  {
    public bool ShowDialogYesNo()
    {
      var result = MessageBox.Show("DialogMessage", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
      if (result == DialogResult.Yes)
        return true;
      return false;
    }
  }


 public class DialogServiceUwp : IDialogService
  {
    public bool ShowDialogYesNo()
    {
      //????
    }
  }

这个类最初是在.NET2项目中,然后我将其添加为UWP项目的链接。所以它基本上是同一个文件。

  public class SomeSharedUtil
  {
    IDialogService _commonDialog;
    public SomeSharedUtil(IDialogService commonDialog)
    {
      _commonDialog = commonDialog;
    }

    public bool AskUser()
    {
      return _commonDialog.ShowDialogYesNo();
    }
  }

1 个答案:

答案 0 :(得分:4)

你做不到。异步操作需要与同步方法不同的公共API。 调用者需要以不同的方式调用同步和异步操作(除非它是一个fire and forget方法)所以两个类型不能完成相同的契约(也就是接口),如果一个是只有同步,一个只是异步。