小编Vek*_*ksi的帖子

将异步 - 等待C#代码转换为与调度程序相关的F#

我想知道这是否是一个太广泛的问题,但最近我让自己遇到了一段我想确定如何从C#转换为适当的F#的代码.旅程从这里开始(1)(TPL-F#交互的原始问题),并继续这里(2)(我正在考虑转换为F#的一些示例代码).

示例代码在这里重现的时间太长,但有趣的功能是ActivateAsync,RefreshHubsAddHub.特别有趣的是

  1. AddHub有签名private async Task AddHub(string address).
  2. RefreshHubsAddHub在循环中调用并收集一个列表tasks,然后它在最后等待await Task.WhenAll(tasks),因此返回值与其签名匹配private async Task RefreshHubs(object _).
  3. 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)

c# f# task-parallel-library c#-to-f# orleans

15
推荐指数
1
解决办法
1090
查看次数

为什么没有范围 - 为std :: istream_iterator查找开始和结束的重载?

我有这样的代码

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)

c++ istream-iterator visual-c++ c++11 visual-studio-2012

10
推荐指数
1
解决办法
2617
查看次数

如何在C++正则表达式中捕获0-2组并打印它们?

编辑3

当我遇到正则表达式时,我转向了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)

c++ regex c++11

8
推荐指数
1
解决办法
7280
查看次数

在多个上下文中共享EF中的连接和事务(UnintentionalCodeFirstException)

以下版本和问题作为下面的附加上下文提供.改进的问题表述和问题可以如下:

  • 如何在不执行分布式事务的情况下,首先在EF 6.1.0数据库和.NET 4.5.2中的多个上下文之间共享事务?

为此,我看起来需要在多个上下文之间共享一个连接,但到目前为止我一直在寻找的代码示例和教程并没有那么富有成效.问题似乎是如何定义连接对象和事务对象类型的功能组合,以便在构造对象上下文时也构建和找到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)

c# entity-framework

8
推荐指数
1
解决办法
2017
查看次数

使用自定义DNS解析程序对DNS故障转移进行单元测试

我最近浏览了一篇有趣的文章单元测试DNS故障转移(受本地管理DNS(Java)的启发.虽然我很想知道.NET中是否有办法安排自定义解析源,但它没有'看起来像这样.

我试图环顾一下System.NET一般和DNS是否为此提供了一些东西.在SO和其他地方有一些问题(例如,在MSDN论坛上切换12,并在MSDN论坛上为System.Net.Dns.GetHostEntry()指定名称服务器),但这些问题提供了使用.NET框架的自定义DNS库组件无法使用.

链接的文章提供了一些更为全面的理由,说明为什么在某些测试场景中这是理想的.有人知道某种方式,即使它涉及P/Invoke吗?

<edit 2016-08-30:Singleton相关的HttpClient不尊重DNS更改和从那里链接的博客帖子Singleton HttpClient?谨防这种严重的行为以及如何解决它并且你正在使用HttpClient错误并且它会破坏你的软件稳定性.这些提供了很好的背景,说明为什么人们可能想要使用单例以及它将导致哪些潜在的麻烦,从而使测试这些场景变得更加重要.

.net dns unit-testing

8
推荐指数
0
解决办法
1378
查看次数

在F#中,具有强制构造函数参数的对象初始化程序语法是什么?

假设有一个带有一个公共构造函数的类,它接受一个参数.此外,我还想设置多个公共属性.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 …

c# f# c#-to-f#

7
推荐指数
2
解决办法
599
查看次数

如何在容器调整大小时重绘这里的地图?

我今天遇到了一个特殊问题,我之前没有遇到或注意过.在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)

here-api

7
推荐指数
1
解决办法
4265
查看次数

如何在仅64位的多个平台上的Nuget中包含本机资产

我正在创建具有以下想法的NuGet包:

  • 具有平台相关的可执行文件和dll(Windows,Linux和MacOS)。
  • 本机二进制文件是64位二进制文​​件。
  • .NET Standard 2.0库以使用这些本机资源。
  • 在.NET库开发和测试期间,应将本机资源包括在构建中,以便可以使用它们。

这个想法不是要嵌入本机资源然后提取它们,而是与使用它们的.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,而不使用该 …

.net nuget .net-standard

7
推荐指数
0
解决办法
1771
查看次数

在Rx中,如何按id对事件进行分组并使用多个TimeSpans限制每个组?

我进入了一个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函数.如果想要为没有事件(例如,一秒,五秒和十秒)定义三个不同的值并且在事件到达时全部取消,该怎么办?我能想到的是:

  • 将每个ID idStream分成几个合成ID,并提供真实ID和合成ID之间的双射映射.例如,在这种情况下ID:1 - > 100,101,102; ID:2 - > 200,201,203和然后定义一个选择器功能在Throttle像这样Func<int, Timespan>(i => /* switch(i)...*/),然后当Subscribe将被调用,映射ID背面.有关更多背景信息,另请参阅相关问题.
  • 创建一个嵌套的分组,其中ID被分组,然后根据限制值将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)

c# events reactive-programming system.reactive

6
推荐指数
1
解决办法
2151
查看次数

如何编写强制复杂模式的F#类型提供程序?

就在最近,我处理了一些流量和旅行信息数据,即Datex2格式的数据.该项目时间不长,现在已经结束了,我继续像往常一样,使用xsd.exe工具生成了一堆强类型的C#类,进行了一些序列化,光处理等等.然而,现在事后我开始怀疑这对于F#类型提供商来说是否是一个很好的例子,所以我首先要抓住这个问题.

考虑到这一点,如何处理一个不应经常改变的复杂模式的情况?由于没有可直接从模式推断类型的公开类型提供程序,我猜选项是:

然后我也开始怀疑C#-F#故事(例如生成或删除的类型)以及如果我想修改类型以更好地检查<xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3">模式中的约束同时还提供良好的开发人员体验.

滚动一个自己的类型看起来像一个相当laborius endavour和最后两个点似乎是最有吸引力的,所以服用的路线描述这里在另一个SO发布.我使用System.XmlSystem.CodeDom修改了要使用的代码Microsoft.FSharp.Compiler.CodeDomFSharpCodeProvider生成F#类型.

唉! 生成的F#代码无法编译(即使添加了适当的引用等).此时我想我可以问一些方向.

问题:是否有一种建议的,经验支持的方法来创建类型提供程序以符合稍微复杂的XML模式(以Datex2为例)如果我想尽可能早地在给定模式中强制执行约束发展周期?

<edit 2013-12-10: Rune FS正试图对此进行攻击,请参阅他提出的问题在提供的类型上获取编译错误.

.net f# xsd type-providers

6
推荐指数
1
解决办法
582
查看次数