C# 我如何实现模式承诺/延期?

C# 我如何实现模式承诺/延期?,c#,promise,C#,Promise,我想写一个模式承诺/改变。 最完美的变体是: MyObject().CallMethodReturningPromise() .done( result => { ...something doing; } ) .fail( error => { ...error handle; } ) .always( () => { ...some code; } ) 我已经找到了这个实现和方法。但是我怎样才能

我想写一个模式承诺/改变。 最完美的变体是:

MyObject().CallMethodReturningPromise()
   .done( result => {
       ...something doing;
   } )
   .fail( error => {
       ...error handle;
   } )
   .always( () => {
       ...some code;
   } )

我已经找到了这个实现和方法。但是我怎样才能用它来解决我的任务呢?

在我看来,这非常适合:

C#通过
Task
s解决这个问题 任务解决的问题与JavaScript中的承诺相同,您可以类似地使用它们。但通常情况下,你不应该这样做

有几个不同之处:

  • 任务具有内置的取消功能
  • 任务并不总是启动,您可以拥有任务并在以后启动它们
  • 承诺执行同化,您不能拥有
    承诺
    ,但您可以拥有C#中任务的任务,并且可能需要在任务上调用
    .Unwrap
  • C#附带的TPL(task parallelization library,任务并行化库)中有一个任务的规范实现,但JavaScript中有许多承诺的实现
使用任务 下面是如何将它们与
async/await
语法结合使用,该语法将添加到ES7中的JavaScript中,并可在ES6中使用,在某些库中使用
yield

async Task Foo(){
    try{
        var res = await myObject.CallMethodReturningTaskOrAsyncMethod();
        doSomethingWithResponse(res);
    } catch(e){
         // handle errors, this will be called if the async task errors
    } finally {
        // this is your .always
    }
}
您还可以选择与
类似的选项。然后
但在C#中这是非常少见的,并且当可以使用wait时,通常不赞成使用它。你可以了解更多关于

差异被映射到
TaskCompletionSource
实例,
Promise
s是C#中的
Task
s<代码>任务。当所有用于您将使用
$的位置时。当
承诺时。所有

你通常写的地方:

a().then(function(res){
    return b(res, "foo");
}).then(function(res2){
    // do work on res2
});
你可以在C#中执行以下操作:


您可以将asynchronous与Task、async和Wait一起使用,如下所示: 注意处理异步,您不需要使用try-catch

 public async Task Method()
   {
     await Task.Run(() =>
            {
                //operations
                Application.Current.Dispatcher.Invoke(() =>
                {
                    //grab the UI Dispatcher if you need
                });
            }).ContinueWith(task =>
            {
                if (task.IsCompleted)
                {
                    //operations success
                }
                else if (task.IsFaulted)
                {
                    //operations failed
                }
            });
        }

出于兴趣,期货模式和承诺之间有实际区别吗?@Gusdor术语很模糊-这些术语在不同的语言中意味着不同的东西。作为旁注,承诺不是关于
。完成
。失败
。总是
-它们更多的是关于
。然后是
。抓住
的错误处理。看看您是否不能使用Task(因为您被困在了较旧版本的.Net中)。我有一个C#promise实现,您可能想尝试一下。也可在nuget上获得:@AshleyDavis周末与你的图书馆玩了一场,太棒了!已提交使用async/await示例用法的拉取请求。@Multix with try/catch,在C#的异步函数中,您可以使用常规的try/catch并处理异步错误。使用
async/await
有助于以同步方式编写异步代码。这是一个非常强大的抽象,你会非常喜欢来自JavaScript的抽象。其中包含使用异步的示例,以及一个简短的教程,介绍如何使用异步处理错误和最佳实践。@Multix有进展吗?你最终用我的答案解决了吗?@Imbledabadee你为什么提出你的编辑?编辑评论应该涵盖这一点。有没有办法确保在同一个线程上调用延续性?@zumalifeguard:看看这个答案-。简言之,一般来说,您无法确保这一点。也许你试图做错事-最好描述一下你想用这种方式解决的特定问题。我需要在同一个线程上运行,因为我想从UI线程访问资源。
var res = await a();
var res2 = await b(res, "foo");
// do work on res2.
 public async Task Method()
   {
     await Task.Run(() =>
            {
                //operations
                Application.Current.Dispatcher.Invoke(() =>
                {
                    //grab the UI Dispatcher if you need
                });
            }).ContinueWith(task =>
            {
                if (task.IsCompleted)
                {
                    //operations success
                }
                else if (task.IsFaulted)
                {
                    //operations failed
                }
            });
        }