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
}
});
}