我想知道这是否是一个太广泛的问题,但最近我让自己遇到了一段我想确定如何从C#转换为适当的F#的代码.旅程从这里开始(1)(TPL-F#交互的原始问题),并继续这里(2)(我正在考虑转换为F#的一些示例代码).
示例代码在这里重现的时间太长,但有趣的功能是ActivateAsync,RefreshHubs和AddHub.特别有趣的是
AddHub有签名private async Task AddHub(string address).RefreshHubsAddHub在循环中调用并收集一个列表tasks,然后它在最后等待await Task.WhenAll(tasks),因此返回值与其签名匹配private async Task RefreshHubs(object _).RefreshHubs被称为ActivateAsync一样await RefreshHubs(null),然后在年底有一个叫await base.ActivateAsync()匹配函数签名public override async Task ActivateAsync().题:
将这些函数签名正确转换为F#仍然保持接口和功能并尊重默认的自定义调度程序是什么?而且我也不太确定这个"在F#中异步/等待".至于如何"机械地"做到这一点.:)
原因是在链接"here(1)"中似乎存在问题(我没有验证这一点),因为F#异步操作不遵循(Orleans)运行时设置的自定义协作调度程序.此外,这里声明TPL操作逃脱调度程序并进入任务池,因此禁止使用它们.
我能想到解决这个问题的一种方法是使用F#函数,如下所示
//Sorry for the inconvenience of shorterned code, for context see the link "here (1)"...
override this.ActivateAsync() =
this.RegisterTimer(new Func<obj, Task>(this.FlushQueue), null, TimeSpan.FromMilliseconds(100.0), …Run Code Online (Sandbox Code Playgroud) 我有这样的代码
std::ifstream file(filename, std::ios_base::in);
if(file.good())
{
file.imbue(std::locale(std::locale(), new delimeter_tokens()));
for(auto& entry : std::istream_iterator<std::string>(file))
{
std::cout << entry << std::endl;
}
}
file.close();
Run Code Online (Sandbox Code Playgroud)
其中std::istream_iterator<std::string>的 begin()和end()
定义如下
template<class T>
std::istream_iterator<T> begin(std::istream_iterator<T>& stream)
{
return stream;
}
template<class T>
std::istream_iterator<T> end(std::istream_iterator<T>& stream)
{
return std::istream_iterator<T>();
}
Run Code Online (Sandbox Code Playgroud)
这也是马克·尼尔森在Dobb博士这里所写的内容.唉,代码无法在我的Visual Studio 2012上使用错误消息进行编译
错误C3312:找不到类型'std :: istream_iterator <_Ty>'的可调用'begin'函数
和
错误C3312:找不到类型'std :: istream_iterator <_Ty>'的可调用'end'函数
问题:有没有我没有注意到的东西,编译器中的错误(不太可能,但只是以防万一)或......好吧,任何想法?
根据Xeo的建议,这些问题会得到很大的清理.为了提供更多的背景和参考,这与我在Stackoverflow上的另一个问题有关,我想知道如何使基于行的解析比通常的循环更清晰.从互联网上进行了一些编码和检查,我的工作草图如下
std::ifstream file(filename, std::ios_base::in);
if(file.good())
{
file.imbue(std::locale(std::locale(), new delimeter_tokens()));
for(auto& entry …Run Code Online (Sandbox Code Playgroud) 当我遇到正则表达式时,我转向了good'ol自定义解析方法.它并没有那么糟糕,因为文件内容可以非常巧妙地进行标记,并且可以使用非常简单的状态机在循环中解析标记.谁想要检查,还有的代码区间为,ifstream的迭代器和自定义的流标记者在#1我的其他问题这样一个片段在这里.这些技术大大降低了自定义解析器的复杂性.
我想在第一部分中将文件内容标记为两个捕获组,然后逐行标记.我喜欢半功能解决方案,但我想学习如何做得更好.也就是说,没有"额外处理"来弥补我对捕获组的缺乏知识.接下来是一些预赛,最后是一个更确切的问题(线路
const std::regex expression("([^:]+?)(^:|$)");
Run Code Online (Sandbox Code Playgroud)
...是我想要询问的与处理结果相关的那个).
基本上定义的文件如下:
definition_literal : value_literal
definition_literal : value_literal
definition_literal : value_literal
definition_literal : value_literal
HOW TO INTERPRET THE FOLLOWING SECTION OF ROWS
[DATA ROW 1]
[DATA ROW 2]
...
[DATA ROW n]
Run Code Online (Sandbox Code Playgroud)
其中每个数据行由一定数量的整数或由空格分隔的浮点数组成.每行具有与其他行一样多的数字(例如,每行可以具有四个整数).因此,"解释部分"基本上以一行的纯文本形式告诉这种格式.
我有一个几乎可以工作的解决方案,读取这样的文件:
int main()
{
std::ifstream file("xyz", std::ios_base::in);
if(file.good())
{
std::stringstream file_memory_buffer;
file_memory_buffer << file.rdbuf();
std::string str = file_memory_buffer.str();
file.close();
const std::regex expression("([^:]+?)(^:|$)");
std::smatch result;
const std::sregex_token_iterator end;
for(std::sregex_token_iterator i(str.begin(), str.end(), expression); i != end; ++i)
{
std::cout …Run Code Online (Sandbox Code Playgroud) 以下版本和问题作为下面的附加上下文提供.改进的问题表述和问题可以如下:
为此,我看起来需要在多个上下文之间共享一个连接,但到目前为止我一直在寻找的代码示例和教程并没有那么富有成效.问题似乎是如何定义连接对象和事务对象类型的功能组合,以便在构造对象上下文时也构建和找到EF数据库第一个对象元数据.
也就是说,我希望做类似什么在EF 6.n教程描述了这里.一些示例代码可能是
int count1;
int count2;
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
//How to define this connection so as not to run into UnintentionalCodeFirstException?
//Creating a dummy context to obtain the connectiong string like so
//dummyContext.Database.Connection.ConnectionString and then using the connection will be greeted with the aforementioned exception.
using(var conn = new SqlConnection("..."))
{
using(var c1 = new SomeEntities(conn, contextOwnsConnection: false))
{
//Use some stored procedures etc.
count1 = await c1.SomeEntity1.CountAsync();
} …Run Code Online (Sandbox Code Playgroud) 我最近浏览了一篇有趣的文章单元测试DNS故障转移(受本地管理DNS(Java)的启发.虽然我很想知道.NET中是否有办法安排自定义解析源,但它没有'看起来像这样.
我试图环顾一下System.NET一般和DNS是否为此提供了一些东西.在SO和其他地方有一些问题(例如,在MSDN论坛上切换为1和2,并在MSDN论坛上为System.Net.Dns.GetHostEntry()指定名称服务器),但这些问题提供了使用.NET框架的自定义DNS库组件无法使用.
链接的文章提供了一些更为全面的理由,说明为什么在某些测试场景中这是理想的.有人知道某种方式,即使它涉及P/Invoke吗?
<edit 2016-08-30:与Singleton相关的HttpClient不尊重DNS更改和从那里链接的博客帖子Singleton HttpClient?谨防这种严重的行为以及如何解决它并且你正在使用HttpClient错误并且它会破坏你的软件稳定性.这些提供了很好的背景,说明为什么人们可能想要使用单例以及它将导致哪些潜在的麻烦,从而使测试这些场景变得更加重要.
假设有一个带有一个公共构造函数的类,它接受一个参数.此外,我还想设置多个公共属性.F#中的语法是什么?例如在C#中
public class SomeClass
{
public string SomeProperty { get; set; }
public SomeClass(string s)
{ }
}
//And associated usage.
var sc = new SomeClass("") { SomeProperty = "" };
Run Code Online (Sandbox Code Playgroud)
在F#中,我可以使用构造函数或属性设置器完成此操作,但不能同时使用C#.例如,以下内容无效
let sc1 = new SomeClass("", SomeProperty = "")
let sc2 = new SomeClass(s = "", SomeProperty = "")
let sc3 = new SomeClass("")(SomeProperty = "")
Run Code Online (Sandbox Code Playgroud)
看起来我错过了什么,但是什么?
<编辑:正如David指出的那样,在F#中完成所有工作,但由于某种原因,至少对我来说:),当在F#中使用的类在C#中定义时,它变得很困难.至于这样的一个例子是TopicDescription(为了补充一个例子来构建公开的东西).例如,人们可以写
let t = new TopicDescription("", IsReadOnly = true)
Run Code Online (Sandbox Code Playgroud)
并且相应的编译器错误将是Method 'set_IsReadOnly' is …
我今天遇到了一个特殊问题,我之前没有遇到或注意过.在Here Maps 3.0中设置地图时,我注意到如果浏览器窗口"小",少于全屏,在加载地图期间,即使浏览器窗口调整为大小,地图也会保持较小一个全屏的.
我如何更新Here Maps地图大小以占用分配的空间?
我的安排如下,我想知道这可能是亲戚div的原因.我拥有它们的原因是我正在尝试具有页眉,页脚,带有和不带滚动条的其他文本的设计(如果页面上存在滚动条,看起来滚动地图会有点紧张).
<style type="text/css">
#mapContainer {
width: 100%;
height: 100%;
left: 0;
top: 0;
position: absolute;
background: grey;
}
#main {
position: relative;
width: 100%;
height: 100%;
}
html, body {
overflow-y: hidden;
}
</style>
<div id="main">
<div id="mapContainer"></div>
</div>
Run Code Online (Sandbox Code Playgroud) 我正在创建具有以下想法的NuGet包:
这个想法不是要嵌入本机资源然后提取它们,而是与使用它们的.NET库一起分发。但是,我遇到了一些我想问的问题。
1.外部依赖关系的根是否有一个公认的约定?目前,我的结构是:
.\Solution.sln
.\Solution.nuspec
.\runtimes\win-x64\native\<.exe and .dll>
.\Project\Project.csproj
Run Code Online (Sandbox Code Playgroud)
.NET Standard 2.0库项目编译为Project\bin\Debug\netstandard2.0。我想知道根是否还有其他约定或名称。除了其他资源和GitHub项目,我还阅读了创建NuGet包的项目。
2.以.nuspec其他方式获取文件非常普通,我想知道如何安排文件引用?我阅读了Nuspec更换令牌上的说明,并且在.nuspec文件中有一节告诉您:
<files>
<file src="bin/$configuration$/$id$.pdb" target="lib/netstandard20" />
<file src="bin/$configuration$/$id$.dll" target="lib/netstandard20" />
<file src="runtimes/win-x64/native/.exe" target="runtimes/win-x64/native/.exe" />
<file src="runtimes/win-x64/native/.dll" target="runtimes/win-x64/native/.dll" />
</files>
Run Code Online (Sandbox Code Playgroud)
但是不包含本机文件。当我尝试以开始设置相对路径时也是如此..\(我仍然可能会遇到这个错误,可能会睡一会再重试)。
3.我是否应该包括某种.props文件,然后对使用Nuget库的人正确地包含包装器和本机资源?应该进行设置,以包括并设置所有本机资源的两个文件,以便将它们与其他构建工件一起复制到项目输出中。
4.我应该做些特别的安排Project.csproj吗?也许更好的问题是,我应该注意一些健壮的做法吗?我看到有一些问题和答案,例如https://github.com/aspnet/websdk/issues/204#issuecomment-302482115。或者实际上是将本机dll自动复制到Visual Studio中引用项目的bin文件夹中,也自动从Nuget Package中提取本机和托管DLL。我应该提到的Project.csproj只是我设置了:
<PropertyGroup>
<RuntimeIdentifiers>win-x64;osx.10-11-x64;ubuntu.16.04-x64;debian.8-x64</RuntimeIdentifiers>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
编辑: Do!我正在尝试通过创建包dotnet pack .\Project\Project.csproj,而不使用该 …
我进入了一个Rx狂欢,可以这么说,这个问题与我这里和这里有关.然而,也许这些对某些人有帮助,因为我可以将它们视为同一主题的有用变体.
问题:如何将一组随机流int(例如,在随机间隔上产生的间隔[0,10])对象分组并为earch组提供可变数量的事件警报(由于缺乏更好的定义,进一步的背景见链接的帖子).更具体地说,使用代码,如何在下面定义每个组的多重节流设置:
var idAlarmStream = idStream
.Select(i => i)
.GroupByUntil(key => key.Id, grp => grp.Throttle(Timespan.FromMilliseconds(1000))
.SelectMany(grp => grp.TakeLast(1))
.Subscribe(i => Console.WriteLine(i));
Run Code Online (Sandbox Code Playgroud)
如果每组缺少多于一秒的ID,则将调用subscribe函数.如果想要为没有事件(例如,一秒,五秒和十秒)定义三个不同的值并且在事件到达时全部取消,该怎么办?我能想到的是:
idStream分成几个合成ID,并提供真实ID和合成ID之间的双射映射.例如,在这种情况下ID:1 - > 100,101,102; ID:2 - > 200,201,203和然后定义一个选择器功能在Throttle像这样Func<int, Timespan>(i => /* switch(i)...*/),然后当Subscribe将被调用,映射ID背面.有关更多背景信息,另请参阅相关问题.在一个更一般的设置中,我怀疑,这是一种情况,每个组有多个处理程序,虽然我没有设法找到任何与此相关的东西.
<编辑:
作为一个(希望澄清)一个例子idStream推送一个ID:1,将启动三个不同的计数器,每个计数器等待下一个事件发生或如果没有及时检测到新的ID 1则报警.计数器1(C1)等待5秒钟,计数器2(C2)等待7秒钟,计数器3(C3)等待10秒钟.如果在[0,5]秒的时间内收到新的ID 1,则所有计数器将使用上述值重新初始化,并且不会发送任何警报.如果在[0,7]秒间隔内收到新ID,则会重新初始化C1报警和C2和C3.类似地,如果在区间[0,10]内接收到新的ID,则C1和C2会激活,但C3才会重新初始化.
也就是说,在给定某些条件的情况下,将存在多个"缺席警报"或一般而言,针对一个ID采取的动作.我不确定什么是好的模拟......也许在塔中叠加"警示灯",这样首先是绿色,然后是黄色,最后是红色.由于ID的缺失持续时间越来越长,颜色之后的颜色将被点亮(在这种情况下,红色是最后一个).然后,当检测到一个ID时,所有灯都将关闭.
<编辑2:
在将詹姆斯的代码改装为示例如下并将其余部分保留为书面时,我发现Subscribe将在两个警报级别的第一个事件上直接调用.
const int MaxLevels = 2;
var idAlarmStream = idStream
.Select(i => i)
.AlarmSystem(keySelector, thresholdSelector, MaxLevels, TaskPoolScheduler.Default)
.Subscribe(i => …Run Code Online (Sandbox Code Playgroud) 就在最近,我处理了一些流量和旅行信息数据,即Datex2格式的数据.该项目时间不长,现在已经结束了,我继续像往常一样,使用xsd.exe工具生成了一堆强类型的C#类,进行了一些序列化,光处理等等.然而,现在事后我开始怀疑这对于F#类型提供商来说是否是一个很好的例子,所以我首先要抓住这个问题.
考虑到这一点,如何处理一个不应经常改变的复杂模式的情况?由于没有可直接从模式推断类型的公开类型提供程序,我猜选项是:
然后我也开始怀疑C#-F#故事(例如生成或删除的类型)以及如果我想修改类型以更好地检查<xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3">模式中的约束同时还提供良好的开发人员体验.
滚动一个自己的类型看起来像一个相当laborius endavour和最后两个点似乎是最有吸引力的,所以服用的路线描述这里的号在另一个SO发布.我使用System.Xml并System.CodeDom修改了要使用的代码Microsoft.FSharp.Compiler.CodeDom并FSharpCodeProvider生成F#类型.
唉! 生成的F#代码无法编译(即使添加了适当的引用等).此时我想我可以问一些方向.
问题:是否有一种建议的,经验支持的方法来创建类型提供程序以符合稍微复杂的XML模式(以Datex2为例)如果我想尽可能早地在给定模式中强制执行约束发展周期?
<edit 2013-12-10: Rune FS正试图对此进行攻击,请参阅他提出的问题在提供的类型上获取编译错误.