锁定语句中不允许使用C#(.NET Async CTP)中的await关键字.
来自MSDN:
await表达式不能用于同步函数,查询表达式,异常处理语句的catch或finally块,lock语句块或不安全上下文中.
我认为编译器团队出于某种原因要么难以实施,要么难以实现.
我尝试使用using语句:
class Async
{
public static async Task<IDisposable> Lock(object obj)
{
while (!Monitor.TryEnter(obj))
await TaskEx.Yield();
return new ExitDisposable(obj);
}
private class ExitDisposable : IDisposable
{
private readonly object obj;
public ExitDisposable(object obj) { this.obj = obj; }
public void Dispose() { Monitor.Exit(this.obj); }
}
}
// example usage
using (await Async.Lock(padlock))
{
await SomethingAsync();
}
Run Code Online (Sandbox Code Playgroud)
但是这不能按预期工作.在ExitDisposable.Dispose中对Monitor.Exit的调用似乎无限期地(大部分时间)阻塞,导致死锁,因为其他线程试图获取锁.我怀疑我的工作不可靠以及锁定语句中不允许等待语句的原因在某种程度上是相关的.
有谁知道为什么在锁定声明的正文中不允许等待?
我有一个在Windows服务中托管的WCF REST服务,我希望每次响应都发送Access-Control-Allow-Origin HTTP标头(定义为CORS的一部分).
我尝试的解决方案是在IDispatchMessageInspector实现中使用以下内容:
public void BeforeSendReply(ref Message reply, object correlationState)
{
var httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty;
if (httpResponse != null)
{
// test of CORS
httpResponse.Headers["Access-Control-Allow-Origin"] = "*";
}
}
Run Code Online (Sandbox Code Playgroud)
通常这可以工作,但不幸的是我的服务也使用HTTP基本授权,这意味着当请求进入而没有Authorization标头时,WCF会自动发送401响应,要求提供凭据.遗憾的是,在此初始交换期间,WCF不会调用我的IDispatchMessageInspector,因此Access-Control-Allow-Origin标头不会添加到初始交换中.
当我尝试从浏览器调用服务时,会出现此问题.CORS指定仅当源域与Access-Control-Allow-Origin响应头中列出的域匹配时才允许跨源请求(*匹配所有域).不幸的是,当浏览器看到没有Access-Control-Allow-Origin标头的初始401响应时,它会阻止访问(根据相同的源策略).
有没有办法在WCF自动发送的初始401响应中添加标头?
我一直在使用C++和CMake构建跨平台应用程序.不幸的是,许多库不包含CMake项目描述.例如,Google支持的项目经常使用GYP.
以下是我为此问题采取的一些方法:
查找或编写库的CMakeLists.txt描述是一个维护问题.随着库的更新,我的CMake描述也必须更新.此外,图书馆作者创建的项目文件更可能是正确的.
我应该如何具体地将GYP项目集成到基于CMake的软件中?在CMake中复制项目描述是最好的方法,还是CMake的某些功能我缺少?
在CMake中处理这类问题的一般方法有哪些?那些包含各种平台/ IDE的项目文件的库呢?CMake是否提供了将这些项目集成到我的项目中的方法?
我听说volatile是像const这样的重载因素.
如果一个函数被volatile参数重载,那么什么时候调用volatile-version?
我无法想象调用volatile-version时的情况.
我正在使用 CMake 来定义我的项目。我的目标是让特定于平台的文件易于访问,以便在所有平台上进行编辑、搜索、浏览和源代码控制。
我目前在 cmake 描述中分离了特定于平台的文件。我的 CMakeLists.txt 文件如下所示:
Foo.hpp
${platform_directory}/Foo.cpp
Run Code Online (Sandbox Code Playgroud)
然后在磁盘上我有这样的东西:
Foo.hpp
win
`- Foo.cpp
osx
`- Foo.cpp
Run Code Online (Sandbox Code Playgroud)
生成的项目文件中的内容如下:
Foo.hpp
Foo.cpp (platform-specific version)
Run Code Online (Sandbox Code Playgroud)
这对于编译器来说是完美的,但这意味着开发人员缺乏用于非本地平台特定文件的 IDE 工具。
我正在寻找的是这样的(在 Xcode 中):
Foo.hpp
Foo.cpp (OS X version)
win
`- Foo.cpp (file type set to plain text)
Run Code Online (Sandbox Code Playgroud)
或者在 Visual Studio 中:
Foo.hpp
Foo.cpp (Windows version)
osx
`- Foo.cpp (build action set to none)
Run Code Online (Sandbox Code Playgroud)
关于如何设置 CMake 的任何想法?