小编Dai*_*Dai的帖子

继续取消任务

我已经定义了以下任务

var t = Task.Factory.StartNew(
    () => LongRunningMethod( cancellationToken ),
    cancellationToken
);

t.ContinueWith(
    Callback,
    cancellationToken,
    TaskContinuationOptions.None,
    TaskScheduler.FromCurrentSynchronizationContext()
);
Run Code Online (Sandbox Code Playgroud)

在里面LongRunningMethod,我检查取消令牌是否有请求取消,如果是,我从方法返回.那很好用.

但是,在此方案中不会调用Callback.回调被调用,如果我替换上面的第二行

t.ContinueWith(
    x => Callback( x, cancellationToken ),
    TaskScheduler.FromCurrentSynchronizationContext()
);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,任务仍然认为它已完成.

为什么第一次通话不起作用?我的印象TaskContinuationOptions.None是,无论线程的状态如何,都会调用回调.

我通过调用取消任务:

_cancellationTokenSource.Cancel();
Run Code Online (Sandbox Code Playgroud)

在一个有点相关的说明,不得不传递取消令牌似乎是任务库的主要设计缺陷.

asynchronous task c#-4.0

9
推荐指数
1
解决办法
9292
查看次数

WCF中的mexTcpBinding - IMetadataExchange错误

我想要一个WCF-over-TCP服务工作.我在修改自己的项目时遇到了一些问题,所以我想我会从VS2008中包含的"基础"WCF模板开始.

这是最初的WCF App.config,当我运行该服务时,WCF测试客户端可以正常使用它:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.web>
        <compilation debug="true" />
    </system.web>
    <system.serviceModel>
        <services>
            <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfTcpTest/Service1/" />
                    </baseAddresses>
                </host>
                <endpoint address="" binding="wsHttpBinding" contract="WcfTcpTest.IService1">
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="WcfTcpTest.Service1Behavior">
                    <serviceMetadata httpGetEnabled="True"/>
                    <serviceDebug includeExceptionDetailInFaults="True" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)

这完美无缺,完全没有问题.

我认为将其从HTTP更改为TCP将是微不足道的:将绑定更改为其TCP等效项并删除httpGetEnabled serviceMetadata元素:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.web>
        <compilation debug="true" />
    </system.web>
    <system.serviceModel>
        <services>
            <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://localhost:1337/Service1/" />
                    </baseAddresses>
                </host>
                <endpoint …
Run Code Online (Sandbox Code Playgroud)

wcf tcp net.tcp

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

GetPrivateProfileString - 缓冲区长度

Windows的GetPrivateProfileXXX函数(用于处理INI文件)有一些关于处理缓冲区长度的奇怪规则.

GetPrivateProfileString的文档说明:

如果[...]提供的目标缓冲区太小而无法保存请求的字符串,则字符串将被截断,后跟空字符,返回值等于nSize减1.

我读了这篇文章,我意识到这种行为使得无法区分代码中的两个场景:

  • 当值字符串的长度恰好等于nSize - 1时.
  • 当nSize值(即缓冲区)太小时.

我以为我会做实验:

我在INI文件中有这个:

[Bar]
foo=123456
Run Code Online (Sandbox Code Playgroud)

我用这些参数调用GetPrivateProfileString作为测试:

// Test 1. The buffer is big enough for the string (16 character buffer).
BYTE* buffer1 = (BYTE*)calloc(16, 2); // using 2-byte characters ("Unicode")
DWORD result1 = GetPrivateProfileString(L"Bar", L"foo", NULL, buffer, 16, fileName);

// result1 is 6
// buffer1 is { 49, 0, 50, 0, 51, 0, 52, 0, 53, 0, 54, 0, 0, 0, 0, 0, ... , 0, 0 }

// Test 2. The buffer …
Run Code Online (Sandbox Code Playgroud)

winapi ini

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

NSRegularExpression中命名的捕获组 - 获取范围的组名称

Apple称NSRegularExpression基于ICU正则表达式库:https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSRegularExpression_Class/

当前支持的模式语法是ICU指定的语法.ICU正则表达式在http://userguide.icu-project.org/strings/regexp中描述.

该页面(在icu-project.org上)声称现在支持命名捕获组,使用与.NET Regular Expressions相同的语法:

(?<name>...) 命名捕获组.该<angle brackets>是文字-它们出现在格局.

我编写了一个程序,它获得了一个看似正确的多个范围的匹配 - 虽然每个范围都返回两次(原因未知) - 但我唯一的信息是范围索引及其文本范围.

例如,正则表达式:^(?<foo>foo)\.(?<bar>bar)\.(?<bar2>baz)$带有测试字符串foo.bar.baz

给我这些结果:

Idx    Start    Length     Text
0      0        11         foo.bar.baz
1      0         3         foo
2      4         3         bar
3      8         3         baz
Run Code Online (Sandbox Code Playgroud)

有没有办法知道" baz"来自捕获组bar2

regex icu ios nsregularexpression

8
推荐指数
2
解决办法
2423
查看次数

设置包值返回nil

我在我的应用程序中添加了一个Settings包,在Xcode中它出现在我的项目树视图的根目录中.

Root.plist文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>StringsTable</key>
    <string>Root</string>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
            <key>Title</key>
            <string>Service</string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSTextFieldSpecifier</string>
            <key>Title</key>
            <string>Hostname</string>
            <key>Key</key>
            <string>service_hostname</string>
   <!-- and so on -->
Run Code Online (Sandbox Code Playgroud)

当我在iOS上打开"设置"应用程序时,条目显示在底部,我可以完美地显示和编辑我的设置.

但是我无法从代码中检索这些值.这是我的代码:

static func loadSettings() {

    let ud = NSUserDefaults.standardUserDefaults()
    ud.synchronize()

    Settings.hostName = ud.stringForKey("service_hostname")
    // etc
}
Run Code Online (Sandbox Code Playgroud)

我也试过ud.objectForKeyud.valueForKey-都返回nil为好.

设置Settings.hostNameXcode调试器报告后,nil尽管我在"设置"应用中设置了显式值,但它仍具有值.

我看到了这个帖子(iPhone应用程序:如何从root.plist获取默认值?),其中有人发布了一大块Objective-C代码,手动将Root.plist文件直接加载到一个NSMutableDictionary和调用中,NSUserDefaults.standardUserDefaults().registerDefaults但这似乎是一个黑客(我可以'让它在Swift中工作,因为编译器说它stringByAppendingPathComponent不再存在了)

为什么不 …

settings nsuserdefaults ios swift

8
推荐指数
3
解决办法
4119
查看次数

订阅续订时是否引发了customer.subscription.updated事件?

我很困惑为什么Stripe的文档表明customer.subscription.updated当我认为事件不应该被触发时:

  • Stripe subscription对象具有属性current_period_start,current_period_end只要客户成功支付订阅的发票,就会更新这些属性(https://stripe.com/docs/api#subscriptions)
  • customer.subscription.updated事件的文件说明它......

    订阅更改时发生.示例包括从一个计划切换到另一个计划,或将状态从试用切换到活动.

    ......这意味着如果current_period_startcurrent_period_end值发生变化会引发事件,但是如果它确实存在或者在这种情况下不确认,则不会确认事件.

    然而,这在第三方网页指出,当成功执行了更新它不是提高(https://www.masteringmodernpayments.com/stripe-webhook-event-cheatsheet#8).

  • 但提升这一事件是有道理的......

  • 当然,如果应用程序需要监视单个事件类型(即customer.subscription.updated),那么它将大大简化程序代码,而无需同时监视invoice.payment_succeeded,invoice.createdcharge.succeeded.
  • 但是,订阅生命周期(https://stripe.com/docs/subscriptions/lifecycle)的文档完全没有提及该customer.subscription.updated事件.

看起来很奇怪,这样一个适当的事件在它应该的时候不会被提出.文档也没有说明何时更新current_period_endcurrent_period_start值,这限制了它们的实用性.

所以在我的应用程序中,在收到一个invoice.payment_succeeded事件后,我的程序代码如何确定客户的订阅期何时结束呢?

webhooks stripe-payments

8
推荐指数
2
解决办法
3150
查看次数

如何将fatalError消息保存到iOS崩溃日志?

我有一个用Xcode 8.2.1编写的Swift 2中的iOS应用程序,它是为iOS 10.2构建的.

我从TestFlight获得了许多崩溃报告,尽管有符号表示,但崩溃日志除了堆栈跟踪(没有参数值,没有本地,没有堆对象等)之外都没有显示任何程序状态.

...但在这些函数中我可以看到可能失败的代码(例如强制解包)但崩溃日志并没有告诉我它失败的地点或原因.

在Xcode中调试时,我可以使用fatalError(message: String)我可以将自己的消息放在哪里"functionFoo returned nil"或者"variable bar == \"" + bar + "\"",除非使用TestFlight或App Store部署时fatalError将被命中并且程序终止,但该message值不会保存到崩溃日志中,使其无意义.

在其他环境中,比如C#/.NET和Java,我可以简单地throw new SomeExceptionType("my message")在所有的全局catch(Exception)处理程序中提供所有信息.

如何在iOS/Swift中实现相同的目标?

cocoa-touch ios swift

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

重新创建Win32的标题是一个好主意吗?

我发现自己最近在Win32上做了更多的C/C++代码,并且来自C#背景我已经开发了一个完全一致的"干净代码"的痴迷,所以从美丽的System.*命名空间转回到组成Win32 API头文件的#defines的mishmash有点文化冲击.

在阅读了MSDN按字母顺序排列的Win32核心函数列表之后,我意识到Win32的API设计实际上是多么简单,不幸的是它被过去25年的所有瑕疵笼罩着,包括许多对16位编程的引用,它们在今天完全无关紧要64位世界.

我很快就要开始一个新的C/C++项目了,我正在考虑如何根据需要重新创建Win32的头文件.我可以将它设计得很漂亮,但它会保持与现有程序的100%二进制(和源)兼容性(因为#defines最终解决了同样的问题).

我想知道是否有人曾经尝试过这个(谷歌什么都没有),或者是否有人想劝阻我.

我想到的另一件事是,如何使用更干净的C Win32 API,可以在顶部设计更干净,更易于使用的C++ Win32 API包装器,因为旧的C Win32项目不会有任何命名空间污染.

编辑:

只是为了澄清,我不是为了提高编译性能或任何类型的优化,我完全清楚编译器会废弃所有未使用的东西.我在这里的任务是拥有一个很高兴使用的Win32头库(因为我不需要每次使用函数时都按下Caps-lock).

c winapi header

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

Lucene.net - 索引期间崩溃

在使用大约16GB的索引文件写入索引文件之后,使用Lucene的索引器似乎在索引操作期间崩溃.

写入控制台的堆栈跟踪重复三次,原因我不知道.为简洁起见,我只提供了重复的单个部分.这是Lucene写给conolse的堆栈跟踪:

Lucene.Net.Index.MergePolicy+MergeException: Exception of type 'Lucene.Net.Index.MergePolicy+MergeException' was thrown. --->

System.IO.FileNotFoundException: Could not find file 'PATH_TO_MY_INDEX_DIRECTORY\_xx.cfs'.

File name: 'PATH_TO_MY_INDEX_DIRECTORY\_xx.cfs'
at Lucene.Net.Index.IndexWriter.HandleMergeException(Exception t, OneMerge merge)
at Lucene.Net.Index.IndexWriter.Merge(OneMerge merge)
at Lucene.Net.Index.ConcurrentMergeScheduler.MergeThread.Run()
--- End of inner exception stack trace ---
at Lucene.Net.Index.ConcurrentMergeScheduler.HandleMergeException(Exception exc)
at Lucene.Net.Index.ConcurrentMergeScheduler.MergeThread.Run()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Run Code Online (Sandbox Code Playgroud)

当我用Luke的Java版本打开生成的日志时,索引被删除(可能是因为它已损坏,例如"write.lock"文件仍然存在),尽管这可能是Luke的错误或错误配置.

创建这个索引大约需要36个小时,而且我不想第三次再次这样做(这不是第一次发生).

我不知道是什么造成了这个.我能做什么?

我正在使用Lucene.net 2.9.2,因为它是为.NET 3.5构建的最后一个版本.

lucene lucene.net luke

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

没有为'DBNull'类型定义Operator'='并输入'Integer'

过去几个小时我一直在苦苦挣扎,仍然无法理解这一点.我遇到的问题是当有人被录取数据库更新给他们BedID时,当我尝试释放他们时,我似乎无法将BedID(在数据库中)设置为空.这是一个问题,因为我需要能够尽可能多地接纳和解雇人员.

Sub Dis1_Click(ByVal s As Object, ByVal e As EventArgs) Handles Dis1.ServerClick

    Dim time As String = Now().ToString("dd-MM-yyyy hh:mm:ss")

    sql = "UPDATE Allocation  SET BedID = NULL , DischargeDate =" + "'" + time + "'" + " WHERE BedID = 1 "
    cmd = New OdbcCommand(sql, cn)
    cmd.ExecuteNonQuery()
End Sub

Sub BedCheck1()
    If r("BedID") = "" Then
    Else
        If r("BedID") = 1 Then
            ba = s & "<tr><td>" & r("Surname") & "</td>" & "<td>" & r("Forename") & "/<td>" & …
Run Code Online (Sandbox Code Playgroud)

vb.net

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