小编Dan*_*ker的帖子

如何在Windows中获取批处理脚本的路径?

我知道它%0包含批处理脚本的完整路径,例如c:\path\to\my\file\abc.bat

我愿意path等于c:\path\to\my\file

我怎么能实现这一目标?

windows batch-file

301
推荐指数
4
解决办法
27万
查看次数

C#事件和线程安全

UPDATE

从C#6开始,这个问题的答案是:

SomeEvent?.Invoke(this, e);
Run Code Online (Sandbox Code Playgroud)

我经常听到/阅读以下建议:

在检查事件之前,请务必复制事件null并将其触发.这将消除线程的潜在问题,其中事件变为null位于您检查null和触发事件的位置之间的位置:

// Copy the event delegate before checking/calling
EventHandler copy = TheEvent;

if (copy != null)
    copy(this, EventArgs.Empty); // Call any handlers on the copied list
Run Code Online (Sandbox Code Playgroud)

更新:我从阅读中了解到这可能还需要事件成员的优化,但Jon Skeet在他的回答中指出CLR不会优化副本.

但同时,为了解决这个问题,另一个线程必须做到这样的事情:

// Better delist from event - don't want our handler called from now on:
otherObject.TheEvent -= OnTheEvent;
// Good, now we can be certain that OnTheEvent will not run...
Run Code Online (Sandbox Code Playgroud)

实际的顺序可能是这种混合物:

// Copy the event delegate before checking/calling
EventHandler copy …
Run Code Online (Sandbox Code Playgroud)

c# events multithreading

230
推荐指数
6
解决办法
8万
查看次数

为什么不能在带有catch的try块内出现yield return?

以下是可以的:

try
{
    Console.WriteLine("Before");

    yield return 1;

    Console.WriteLine("After");
}
finally
{
    Console.WriteLine("Done");
}
Run Code Online (Sandbox Code Playgroud)

finally块在整个执行完毕后运行(IEnumerator<T>支持IDisposable提供一种方法来确保即使枚举在完成之前被放弃).

但这不是好事:

try
{
    Console.WriteLine("Before");

    yield return 1;  // error CS1626: Cannot yield a value in the body of a try block with a catch clause

    Console.WriteLine("After");
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}
Run Code Online (Sandbox Code Playgroud)

假设(为了参数)WriteLinetry块中的一个或另一个调用抛出异常.在catch块中继续执行有什么问题?

当然,收益率回报部分(目前)无法抛出任何东西,但是为什么要阻止我们封闭try/ catch处理在之前或之后抛出的异常yield return

更新:Eric Lippert在这里有一个有趣的评论 - 似乎他们已经有足够的问题正确实现try/finally行为!

编辑:此错误的MSDN页面是:http://msdn.microsoft.com/en-us/library/cs1x15az.aspx.但这并没有解释为什么.

c# exception yield-keyword

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

有多种方法可以让多个进程共享监听套接字?

在套接字编程中,您创建一个侦听套接字,然后对于每个连接的客户端,您将获得一个可用于处理客户端请求的普通流套接字.OS管理幕后传入连接的队列.

两个进程无法同时绑定到同一个端口 - 默认情况下,无论如何.

我想知道是否有一种方法(在任何着名的操作系统,特别是Windows上)启动进程的多个实例,这样它们都绑定到套接字,因此它们有效地共享队列.然后每个流程实例可以是单线程的; 它会在接受新连接时阻止.当客户端连接时,其中一个空闲流程实例将接受该客户端.

这将允许每个进程具有非常简单的单线程实现,除非通过显式共享内存,否则不会共享任何内容,并且用户将能够通过启动更多实例来调整处理带宽.

这样的功能是否存在?

编辑:对于那些问"为什么不使用线程?"的人 显然线程是一种选择.但是在单个进程中有多个线程,所有对象都是可共享的,并且必须非常小心以确保对象不是共享的,或者一次只对一个线程可见,或者是绝对不可变的,以及最流行的语言和运行时缺乏对管理这种复杂性的内置支持.

通过启动一些相同的工作进程,您将获得一个默认不共享的并发系统,从而使构建正确且可伸缩的实现变得更加容易.

sockets concurrency

86
推荐指数
5
解决办法
7万
查看次数

如何用C#将每个单词的第一个字符或整个字符串的第一个字符大写?

我可以编写自己的算法来做到这一点,但我觉得在C#中应该有相当于ruby的人性化.

我用Google搜索,但只找到了将日期人性化的方法.

例子:

  • 将"Lorem Lipsum Et"变成"Lorem lipsum et"的方法
  • 将"Lorem lipsum et"变成"Lorem Lipsum Et"的方法

c# string humanize

59
推荐指数
3
解决办法
5万
查看次数

寻找一种从C++调用Java的便捷方法

似乎大多数与JNI(Java Native Interface)相关的文档或帮助程序库都涉及从Java调用本机代码.这似乎是它的主要用途,即使它能够更多.

我想主要在相反的方向上工作:通过向其添加一些Java库来修改现有的(相当大的)可移植C++程序.例如,我想让它通过JDBC调用数据库,或者通过JMS调用消息队列系统,或发送电子邮件,或调用我自己的Java类等.但是使用原始JNI这是非常不愉快和容易出错的.

所以我理想地想编写可以像C++/CLI一样调用CLR类的C++代码来调用Java类.就像是:

using namespace java::util::regex; // namespaces mapped

Pattern p = Pattern.compile("[,\\s]+");

array<java::lang::String> result = 
    p.split("one,two, three   four ,  five");

for (int i=0; i < result.length(); i++)
    std::cout << result[i] << std::endl;
Run Code Online (Sandbox Code Playgroud)

这样,我就不必通过传递名称和奇怪的签名字符串手动完成获取方法ID的工作,并且可以防止由未经检查的API调用方法引起的编程错误.实际上它看起来很像等效的Java.

NB.我还在谈论使用JNI!作为一项基础技术,它非常适合我的需求.它"在进行中"并且高效.我不想在一个单独的进程中运行Java并对它进行RPC调用.JNI本身很好.我只想要一个愉快的界面.

必须有一个代码生成工具来创建等效的C++类,命名空间,方法等,以完全匹配我指定的一组Java类所公开的内容.生成的C++类将:

  • 拥有接受其参数的类似包装版本的成员函数,然后执行必要的JNI voodoo来进行调用.
  • 以相同的方式包装返回值,以便以自然的方式链接调用.
  • 维护方法ID的每类静态缓存,以避免每次都查找它们.
  • 完全是线程安全的,可移植的,开源的.
  • 每次调用方法后自动检查异常并产生std C++异常.
  • 当我以通常的JNI方式编写本机方法时,也可以工作,但我需要调用其他Java代码.
  • 数组应该在原始类型和类之间完全一致.
  • 毫无疑问需要像global这样的东西来包装引用,当它们需要在本地引用框架之外生存时 - 再次,应该对所有数组/对象引用都一样.

这样一个免费的,开源的,可移植的库/工具是存在还是我在做梦?

注意:我发现了这个现有的问题,但在那种情况下,OP并不像我一样对完美的要求......

更新:关于SWIG的评论引发了我之前的问题,这似乎表明它主要是相反的方向,所以不会做我想要的.

重要

  • 这是关于能够编写操纵Java类和对象的C++代码,而不是相反(参见标题!)
  • 我已经知道JNI存在了(请参阅问题!)但是手工编写的代码到JNI API是不必要的冗长,重复,容易出错,在编译时没有类型检查等.如果你想缓存方法ID和类对象它更加冗长.我想自动生成C++包装类,为我处理所有这些.

更新:我已经开始研究自己的解决方案了:

https://github.com/danielearwicker/cppjvm

如果这已经存在,请告诉我!

NB.如果您正在考虑在自己的项目中使用它,请自由,但请记住,现在代码已经有几个小时了,到目前为止我只编写了三个非常不费力的测试.

java java-native-interface swig invocation

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

为什么C#不支持首次通过异常过滤?

注意:这不是Jeff的问题的重复.

那个问题问"是等同的吗?" 我知道没有,我想知道为什么!

我问的原因是我只是清楚它有多重要,结论对我来说似乎很奇怪.

Microsoft企业库的异常处理块建议我们使用此模式:

catch (Exception x)
{
    if (ExceptionPolicy.HandleException(x, ExceptionPolicies.MyPolicy))
        throw;

    // recover from x somehow
}
Run Code Online (Sandbox Code Playgroud)

该策略是在XML文件中定义的,这意味着如果客户遇到问题,我们可以修改策略以帮助跟踪(或者可能还有问题)以便快速解决问题,直到我们正确处理它为止. - 这可能涉及与第三方争论,关于谁的错.

这基本上是对一个简单事实的承认,即在实际应用中,如果没有这样的设施,实际上就无法管理异常类型的数量及其"可恢复性"状态.

与此同时,MS的CLR团队表示这不是一个选择,事实证明这些人知道他们在谈论什么!问题是在catch块运行之前,finally嵌套在块内的任何块try都将被执行.所以这些finally块可能会执行以下任何操作:

  • 无害地修改程序状态(phew,lucky).
  • 在客户的数据中删除重要的东西,因为程序状态被搞砸到了未知程度.
  • 伪装或破坏我们需要诊断问题的重要证据 - 特别是如果我们谈论调用本机代码.
  • 抛出另一个例外,增加了一般的困惑和痛苦.

请注意,using语句和C++/CLI析构函数构建在try/上finally,因此它们也会受到影响.

很明显,过滤异常的catch/ throw模式并不好.实际需要的是一种通过策略过滤异常而不实际捕获它们从而触发finally块执行的方法,除非我们找到一个告诉我们异常可以安全恢复的策略.

CLR团队最近在博客上写了这篇文章:

结果是我们必须在VB.NET中编写一个辅助函数,以允许我们从C#访问这个重要的功能.存在问题的一个重要线索就是BCL中有代码可以做到这一点.很多人都写过关于这样做的博客,但他们很少提及关于try/ finallyblocks 的事情,这是杀手.

我想知道的是:

  • 是否有人在C#团队收到有关此主题的公开声明或直接电子邮件?
  • 是否有任何现有的Microsoft Connect建议要求这样做?我听说过他们的谣言,但没有一个可能的关键词出现了什么.

更新:如上所述,我已经搜索过Microsoft Connect而没有找到任何内容.我也(不出所料)谷歌搜索.我只找到人们解释为什么他们需要这个功能,或者指出它在VB.NET中优势,或者毫无结果地希望它将 …

c# vb.net exception finally

30
推荐指数
1
解决办法
2253
查看次数

.NET 4.0和C#4.0中的事件和委托逆转

在调查这个问题时,我很好奇C#4.0中新的协方差/逆变特性将如何影响它.

在Beta 1中,C#似乎不同意CLR.回到C#3.0,如果你有:

public event EventHandler<ClickEventArgs> Click;
Run Code Online (Sandbox Code Playgroud)

......然后你在其他地方:

button.Click += new EventHandler<EventArgs>(button_Click);
Run Code Online (Sandbox Code Playgroud)

...编译器会barf,因为它们是不兼容的委托类型.但是在C#4.0中,它编译得很好,因为在CLR 4.0中,类型参数现在被标记为in,因此它是逆变的,因此编译器假定多播委托+=将起作用.

这是我的测试:

public class ClickEventArgs : EventArgs { }

public class Button
{
    public event EventHandler<ClickEventArgs> Click;

    public void MouseDown()
    {
        Click(this, new ClickEventArgs());
    }
}

class Program
{    
    static void Main(string[] args)
    {
        Button button = new Button();

        button.Click += new EventHandler<ClickEventArgs>(button_Click);
        button.Click += new EventHandler<EventArgs>(button_Click);

        button.MouseDown();
    }

    static void button_Click(object s, EventArgs e)
    {
        Console.WriteLine("Button was clicked");
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# events delegates clr4.0 c#-4.0

28
推荐指数
2
解决办法
8461
查看次数

如何在托管C++中使用typeof(int)?

我现在正在开发一个项目,其中一部分使用托管C++.在托管C++代码中,我正在创建一个DataTable.在为数据表定义列时,我需要指定列的类型.在C#中,那会:

typeof运算(INT)

但是我如何在托管C++中做到这一点?

谢谢!

c# c++-cli managed

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

JSON和Protocol Buffers之间是否存在标准映射?

来自对公告博客帖子的评论:

关于JSON:JSON的结构类似于协议缓冲区,但协议缓冲区二进制格式仍然更小,编码速度更快.尽管如此,JSON为协议缓冲区提供了一个很好的文本编码 - 编写一个编码器/解码器,使用protobuf反射将任意协议消息转换为JSON和从JSON转换,这是微不足道的.这是与AJAX应用程序通信的好方法,因为用户在访问您的页面时下载完整的protobuf解码器可能太多了.

制作一个映射可能是微不足道的,但两者之间是否有一个"明显"的映射,任何两个独立的开发团队自然会解决这个问题?如果两个产品支持PB数据并且可以互操作,因为它们共享相同的.proto规范,我想知道如果他们独立引入相同规范的JSON反射,他们是否仍然能够互操作.可能会有一些任意的决定,例如,枚举值是由字符串表示的(人类可读的典型JSON)还是整数值?

那么是否存在已建立的映射,以及用于从.proto规范生成JSON编码器/解码器的任何开源实现?

json protocol-buffers

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