.net core 当从F消耗时,如何忽略C等待任务?

.net core 当从F消耗时,如何忽略C等待任务?,.net-core,f#,async-await,.net Core,F#,Async Await,我正在努力使下面的代码工作 类型消息={ 文本:字符串 } [] 让主argv= 使用bus=RabbitHutch.CreateBushost=localhost 异步的{ 让!result=bus.PubSub.PublishAsync{Text=Text}|>Async.task } 0 知道PublishAsync返回任务。我只是想在F method中等效地等待此方法,但这会触发一个错误: Program.fs(14, 5): [FS0010] Unexpected symbol '}'

我正在努力使下面的代码工作

类型消息={ 文本:字符串 } [] 让主argv= 使用bus=RabbitHutch.CreateBushost=localhost 异步的{ 让!result=bus.PubSub.PublishAsync{Text=Text}|>Async.task } 0 知道PublishAsync返回任务。我只是想在F method中等效地等待此方法,但这会触发一个错误:

Program.fs(14, 5): [FS0010] Unexpected symbol '}' in expression
我已经检查过了,不确定我应该做什么,加上|>忽略似乎什么都做不了

[编辑]

我添加了一个忽略:

类型消息={ 文本:字符串 } [] 让主argv= 使用bus=RabbitHutch.CreateBushost=localhost 异步的{ 让!result=bus.PubSub.PublishAsync{Text=Text}|>Async.task 结果|>忽略 } 0 但现在我得到以下警告:

Program.fs10,5:[FS0020]此表达式的结果具有“Async”类型,并且被隐式忽略。考虑使用“忽略”来显式地丢弃这个值,例如“EXPRE>忽略”,或者“让”将结果绑定到一个名称,例如“让结果= ExpR.< /P>”。 但是无法摆脱这个问题,知道吗?

异步计算表达式返回async。您需要实际运行计算。您可以使用Async.RunSynchronously来实现这一点

虽然在这一点上,我认为计算表达式是多余的。这也会产生同样的效果:

bus.PubSub.PublishAsync({Text = "text"})
|> Async.AwaitTask
|> Async.RunSynchronously
异步计算表达式返回async。您需要实际运行计算。您可以使用Async.RunSynchronously来实现这一点

虽然在这一点上,我认为计算表达式是多余的。这也会产生同样的效果:

bus.PubSub.PublishAsync({Text = "text"})
|> Async.AwaitTask
|> Async.RunSynchronously

此表达式的结果是:

async {
    let! result = bus.PubSub.PublishAsync({Text = "text"}) |> Async.AwaitTask
    result |> ignore
}
是异步类型的值。在F和函数式编程中,每个表达式都应该对较大表达式的结果作出贡献,否则很可能是错误的。因此,编译器报告了警告

要告诉编译器您对此没有问题,只需使用ignore函数将该值转换为单元类型的值,该值类似于其他语言中的void类型

现在看看异步的主体,在旧代码中,最后一条语句是let!结果=。。。并且在F语法中是无效的。每一个出租或出租!是let name=。。。在someExpression中,但这里除了}之外没有表达式,这就是为什么编译器在表达式中说意外的符号“}”

您通过忽略管道结果修复了该问题。没关系,因为这是一个有效的表达式

现在考虑你的新代码,你可以忽略Asic来消除警告,但是这会让你的异步胡说八道。您声明了异步,但没有执行它。可能需要使用Async.RunSynchronously函数执行它:

async {
    let! result = bus.PubSub.PublishAsync({Text = "text"}) |> Async.AwaitTask
    result |> ignore
}
|> Async.RunSynchronously 
由于结果是一个单位值,所以可以使用do!清理代码:

甚至更干净:

bus.PubSub.PublishAsync({Text = "text"})
|> Async.AwaitTask
|> Async.RunSynchronously

此表达式的结果是:

async {
    let! result = bus.PubSub.PublishAsync({Text = "text"}) |> Async.AwaitTask
    result |> ignore
}
是异步类型的值。在F和函数式编程中,每个表达式都应该对较大表达式的结果作出贡献,否则很可能是错误的。因此,编译器报告了警告

要告诉编译器您对此没有问题,只需使用ignore函数将该值转换为单元类型的值,该值类似于其他语言中的void类型

现在看看异步的主体,在旧代码中,最后一条语句是let!结果=。。。并且在F语法中是无效的。每一个出租或出租!是let name=。。。在someExpression中,但这里除了}之外没有表达式,这就是为什么编译器在表达式中说意外的符号“}”

您通过忽略管道结果修复了该问题。没关系,因为这是一个有效的表达式

现在考虑你的新代码,你可以忽略Asic来消除警告,但是这会让你的异步胡说八道。您声明了异步,但没有执行它。可能需要使用Async.RunSynchronously函数执行它:

async {
    let! result = bus.PubSub.PublishAsync({Text = "text"}) |> Async.AwaitTask
    result |> ignore
}
|> Async.RunSynchronously 
由于结果是一个单位值,所以可以使用do!清理代码:

甚至更干净:

bus.PubSub.PublishAsync({Text = "text"})
|> Async.AwaitTask
|> Async.RunSynchronously

除了这不是我想要的:C的await是一个可以在异步函数中使用的语句,而F的async.RunSynchronously接受一个异步对象>>阻塞当前线程,直到该异步对象完成running@EhouarnPerret您可以使用Async.StartImmediate运行计算,而无需等待计算完成,但是如果您这样做,那么您的控制台应用程序将在任何事情发生之前退出。一旦IO绑定操作完成,控制台不可能释放当前线程并稍后在另一个线程上继续,就像等待MyWaitableMethod?@EhouarnPerret您也必须在C中阻止一样。尽管C7.1增加了一些功能,但它所做的只是调用Main.GetAwaiter.GetResult.real?该死,我不知道。因此,对于一个简单的控制台应用程序,每一个异步IO绑定调用都将被分解为在当前线程上等待?除了这不是我想要的:C的await是一个语句,您可以
se在异步函数中,而F的async.RunSynchronously接受一个异步对象>>阻塞当前线程,直到该异步对象完成running@EhouarnPerret您可以使用Async.StartImmediate运行计算,而无需等待计算完成,但是如果您这样做,那么您的控制台应用程序将在任何事情发生之前退出。一旦IO绑定操作完成,控制台不可能释放当前线程并稍后在另一个线程上继续,就像等待MyWaitableMethod?@EhouarnPerret您也必须在C中阻止一样。尽管C7.1增加了一些功能,但它所做的只是调用Main.GetAwaiter.GetResult.real?该死,我不知道。因此,对于一个简单的控制台应用程序,每个绑定到异步IO的调用都将被分解为在当前线程上等待?根据和async.RunSynchronously的源代码:async.RunSynchronously绝对不是C的wait的F等价物。它更像是C的任务。等等,它阻塞当前线程,直到任务完成。允许在异步{}块中,F相当于等待。你说得对!但毕竟您得到的是一个Async类型的值,您必须决定如何使用它。如果您决定在另一个async中使用它,那么就让它吧!他是你的朋友。如果您决定执行它,请使用Async.Run/StartXXX。在许多其他情况下,您会将其传递给另一个需要异步值的库。根据和Async.RunSynchronously的源代码:Async.RunSynchronously绝对不是C的await的F等价物。它更像是C的任务。等等,它阻塞当前线程,直到任务完成。允许在异步{}块中,F相当于等待。你说得对!但毕竟您得到的是一个Async类型的值,您必须决定如何使用它。如果您决定在另一个async中使用它,那么就让它吧!他是你的朋友。如果您决定执行它,请使用Async.Run/StartXXX。在许多其他情况下,您会将其传递给另一个需要异步值的库。这取决于你。