F# netstandard20中的FSharp.Core FSharpFunc.FromConverter
将项目转换为.NET标准2.0时,F# netstandard20中的FSharp.Core FSharpFunc.FromConverter,f#,.net-standard-2.0,F#,.net Standard 2.0,将项目转换为.NET标准2.0时,FSharpFuncFromConverter方法不再可用。有没有办法将此代码转换为.NET标准2.0FSharp.Core实现 async Task<Unit> RunProcess(FSharpMailboxProcessor<T> mailbox, Func<T, Task> process) { ... } public BaseMailboxProcessor(Func<TFuncInput, Task>
FSharpFunc
<FSharp.Core
库中的code>FromConverter方法不再可用。有没有办法将此代码转换为.NET标准2.0FSharp.Core
实现
async Task<Unit> RunProcess(FSharpMailboxProcessor<T> mailbox, Func<T, Task> process) { ... }
public BaseMailboxProcessor(Func<TFuncInput, Task> process, Action<Exception, TFuncInput> errorHandler = null, CancellationToken? cancellationToken = null)
{
m_ErrorHandler = errorHandler;
m_TokenSource = cancellationToken.HasValue ? CancellationTokenSource.CreateLinkedTokenSource(cancellationToken.Value) :
new CancellationTokenSource();
var cancellationOption = FSharpOption<CancellationToken>.Some(m_TokenSource.Token);
Converter<FSharpMailboxProcessor<TMailboxInput>, FSharpAsync<Unit>> converter = (mailbox) =>
{
return FSharpAsync.AwaitTask<Unit>(RunProcess(mailbox, process));
};
m_Mailbox = new FSharpMailboxProcessor<TMailboxInput>(FSharpFunc<FSharpMailboxProcessor<TMailboxInput>, FSharpAsync<Unit>>.FromConverter(converter), cancellationOption);
m_Mailbox.Start();
}
异步任务运行进程(FSharpMailboxProcessor邮箱,Func进程){…}
public BaseMailboxProcessor(Func进程,Action errorHandler=null,CancellationToken?CancellationToken=null)
{
m_ErrorHandler=ErrorHandler;
m_TokenSource=cancellationToken.HasValue?CancellationTokenSource.CreateLinkedTokenSource(cancellationToken.Value):
新的CancellationTokenSource();
var cancellationOption=FSharpOption.Some(m_TokenSource.Token);
转换器=(邮箱)=>
{
返回fsharpsync.AwaitTask(RunProcess(邮箱,进程));
};
m_Mailbox=new FSharpMailboxProcessor(FSharpFunc.FromConverter(converter),cancellationOption);
m_Mailbox.Start();
}
您应该能够使用funconvert.ToFSharpFunc
,这似乎仍然存在于FSharp.Core的netstandard版本中。您可以简单地定义自己的:
let ToFSharpFunc (converter: System.Func<_, _>) = fun t -> converter.Invoke t
let-ToFSharpFunc(converter:System.Func)=funt t->converter.Invoke t
另外,如果你需要在C中使用
FSharpFunc
,你可以在的地方调用.Invoke
。FSharpFunc
对象是Func
,funconvert.ToFSharpFunc
的问题是它返回FSharpFunc
,我需要它返回FSharpFunc
,其中T是FSharpMailboxProcessor
,除非我遗漏了该方法无法实现的内容。有两个funconvert.ToFSharpFunc
重载,一个用于操作
,另一个用于转换器
。转换器
的过载应该正是您所需要的。我本应该指定这一点,但我使用的是最新的FSharp.Core,即4.4.1.0。该方法在netstandard20的该版本中不可用,但在4.4.0.0中可用。我还进行了检查,在使用.net标准2.0时,ToFSharpFunc
不会出现。不知道为什么。我希望能有一个C#实现。但是,作为最后一种手段,将F#dll包含在该函数中可能会起作用。有什么原因不能在C#中使用时在FSharpFunc
上调用?