C# 如何运行同步或异步代码?

C# 如何运行同步或异步代码?,c#,asynchronous,C#,Asynchronous,我有一个类,其中包含一些异步方法,这些方法采用一个处理程序类来决定在成功或失败时应该做什么 public class FooModel { private FooState fooState; public async Task UpdateFooAsync(IHandler handler) { try { var newFooState = await Something(); fooS

我有一个类,其中包含一些异步方法,这些方法采用一个处理程序类来决定在成功或失败时应该做什么

public class FooModel
{
    private FooState fooState;

    public async Task UpdateFooAsync(IHandler handler)
    {
        try
        {
            var newFooState = await Something();
            fooState = newFooState;

            handler.Success();
        }
        catch
        {
            handler.Error();
        }
    }
}

public interface IHandler
{
    void Success();
    void Error();
}
我可以从代码中的几个不同位置调用UpdateFoasync。根据我从哪里打电话,我可能想做不同的事情。例如,同步示例:

public async void update_click(object sender, RoutedEventArgs e)
{
    await UpdateFooAsync(new Handler1());
}

public class Handler1 : IHandler
{
    public void Success()
    {
        Provider.Page.text = "hello";
    }
    public void Error() {}
}
但我可能还想在以下情况下执行异步操作:

private async void updateAndThenSomething_click(object sender, RoutedEventArgs e)
{
    await UpdateFooAsync(new Handler2());
}

// this will generate not implemented error obviously
public class Handler2 : IHandler
{
    public async void SuccessAsync()
    {
        await Provider.OperationAsync();
    }
    public void Error() {}
}
但FooModel不知道接下来是要执行同步还是异步操作。它不应该知道。有没有办法让handler.Success()运行同步代码或异步代码?我读了Stephen Toub的一些文章(),这似乎暗示我不应该将成功作为一项任务,然后在UpdateFoasync try块中等待该任务


我想另一个选择是完全不用处理程序接口。但这需要大量的重构。上述情况在我的代码中经常发生,通常不仅仅是成功和错误。我想强制使用我的代码的人指定成功、错误或其他情况下发生的事情。这就是为什么我要使用这个界面。我想我也可以通过抛出不同类型的异常来实现这一点,但我也不确定这是否是个好主意。

您可以声明处理程序接口以返回
任务,然后在同步情况下使用
任务.FromResult
返回。例如

public interface IHandler
{
    Task Success();
    void Error();
}

public class Handler1 : IHandler
{
    public Task Success()
    {
        Provider.Page.text = "hello";
        return Task.FromResult<object>(null); 
    }
    public void Error() {}
}

public class Handler2 : IHandler
{
    public async Task Success()
    {
        return Provider.OperationAsync();
    }

    public void Error() {}
}
公共接口IHandler
{
任务成功();
无效错误();
}
公共类handler 1:IHandler
{
公共任务成功()
{
Provider.Page.text=“你好”;
返回Task.FromResult(空);
}
公共无效错误(){}
}
公共类handler 2:IHandler
{
公共异步任务成功()
{
返回Provider.OperationAsync();
}
公共无效错误(){}
}

这似乎是一个非常简单的解决方案,谢谢。您是否建议按照.NET约定将名称更改为SuccessAsync,或者在这种情况下不需要这样做?@ghord我只是查找了一下其含义。这样线程就不会返回UpdateFoasync方法或UpdateAndHensomething\u click方法了吗?后者是因为它是异步void吗?如果我在handlerSuccess()下面添加其他代码,或者等待updateFoasync(newhandler2())呢?编辑:我猜评论被删除了