快速小问题......
我知道有时在其他语言库中,出于性能原因,库中的部分代码是用特定于平台的直接C编写的.在这种情况下,尽可能使用库代码可以获得巨大的性能提升.
那么.NET平台也这样做吗?Microsoft的基类库实现是否以某种方式进行了优化,我无法在托管代码中进行匹配?
使用KeyValuePair作为类型安全的元组结构而不是编写自己的结构有什么用呢?
根据问题数量,论坛帖子等,BCL中的TcpClient/NetworkStream实现似乎缺乏对取消IO操作的良好支持.随着.NET 4.5中Async方法的增加,这种缺少取消(或者不错的超时支持)使得事情变得更加令人沮丧,因为在执行IO时取消拒绝监视其CancellationToken的任务变得更加复杂(几乎不可能) .
我已经看到许多实现启动其他线程来监视网络操作并在事情看起来出错时关闭底层流.在我们试图通过使用异步操作来节省这些资源的世界中,这感觉非常脏.
任何人都可以指导我处理有效取消/超时网络IO操作或实际工作的强大第三方实施的指导方向吗?
假设我有一个将从多个线程调用的类,并且我将在此类的私有字段中将一些数据存储在ImmutableDictionary中
public class Something {
private ImmutableDictionary<string,string> _dict;
public Something() {
_dict = ImmutableDictionary<string,string>.Empty;
}
public void Add(string key, string value) {
if(!_dict.ContainsKey(key)) {
_dict = _dict.Add(key,value);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这可以通过多个线程以这种方式调用,你会得到关于字典中已存在的密钥的错误吗?
Thread1检查字典看到false Thread2检查字典看到false Thread1添加值并引用_dict更新Thread2添加值,但它已经添加,因为它使用相同的引用?
c# multithreading immutability thread-safety base-class-library
.NET库中是否有任何可以作为过期的类Lazy<T>?
这个想法是Func<T>值工厂lambda在那里传递并且仅在第一次或者超时传递时调用.
我已经创建了简单的类来做到这一点,但我想避免发明一个轮子.
public class ExpiringLazy<T>
{
private readonly object valueGetLock = new object();
private readonly Func<T> valueFactory;
private readonly TimeSpan timeout;
private T cachedValue;
private DateTime cachedTime;
public T Value
{
get
{
Thread.MemoryBarrier();
if (cachedTime.Equals(default(DateTime)) || DateTime.UtcNow > cachedTime + timeout)
{
lock (valueGetLock)
{
if (cachedTime.Equals(default(DateTime)) || DateTime.UtcNow > cachedTime + timeout)
{
cachedValue = valueFactory();
Thread.MemoryBarrier();
cachedTime = DateTime.UtcNow;
}
}
}
return cachedValue;
}
}
public ExpiringLazy(Func<T> valueFactory, TimeSpan timeout)
{ …Run Code Online (Sandbox Code Playgroud) 我们在.net4.0中有一个C#DLL,但是使用Microsoft.bcl,Microsoft.bcl.async,Microsoft.bcl.build,Microsoft.net.http构建.这些库来自nuget.我们有理由不转移到.net4.5但想要使用async,等待来自这些bcl库.在C#项目中一切正常,但我们无法在我们的C++互操作项目中添加此DLL,我们收到此错误:
当我们尝试将此引用添加到项目时,我们收到此错误.
即使clr interop项目也在.net4.0和我们添加的DLL也在.net4.0中我们最终得到这个错误.有办法解决这个问题吗?
Error in text format:
---------------------------
Microsoft Visual Studio
---------------------------
Could not add a reference to:
C:\xxx\xxx\xx\xxxHelper.dll
For one of the following reasons:
- Targets a higher version of the .NET Framework
- Not a .NET assembly
- Not a registered ActiveX control
---------------------------
OK
---------------------------
Run Code Online (Sandbox Code Playgroud)
代码重现此问题:https://dl.dropboxusercontent.com/u/1967630/BCL_Problem/oAuth2_SDK_consumer_DLL/BCL_Problem_projects.zipx
前段时间我认为Nullable <>值类型是类,封装值类型和bool到HasValue.有一些隐式的转换操作数为null,只是在BCL实现.
但作为一个结构,如何实现这一目标?Nullable <> struct对于CLR来说是"特殊的"吗?
在使用Microsoft.Bcl"Microsoft BCL Portability Pack"时,我无法在MvvmCross Windows Phone 7.1项目中使用await关键字.
我已经在GitHub上发布了我在下面描述的示例项目的代码,并且此行发生了await错误.
当我尝试构建包含FirstViewModel的第三个"核心"Windows可移植类库(PCL)时,我得到以下错误:
Type System.Threading.Tasks.Task<string> not awaitable under VS red squiggles, and
Cannot await 'System.Threading.Tasks.Task<string>' when building.
Run Code Online (Sandbox Code Playgroud)
解决方案中有四个项目:
Windows可移植类库(PCL),其中包含一个接口,用于引用BCL提供的"任务"对象.
一个针对OS 7.1的Windows Phone类库,它实现了上面的接口,并且还使用了BCL中的"任务".
另一个Windows可移植类库(PCL),提供应用程序的"核心"功能,包括ViewModel.
试图引用和使用上述DLL的Windows Phone 7.1 /"7.5"应用程序.
前两个项目包含接口和接口的实现编译没有任何错误.但第三个"核心"PCL无法使用上面显示的错误构建.
更多细节如果你想要他们:
我尝试了这个App.config"修复",如"已知的BCL问题"中所述:http: //blogs.msdn.com/b/bclteam/p/asynctargetingpackkb.aspx.但是当我添加时没有解决错误App.config只是"核心"项目,当我尝试将相同的App.config添加到每个项目时.有可能我没有在元素中使用正确的版本或我只是错误地做了App.config的东西.
解决方案中设置为以PCL为目标的每个项目在Visual Studio中都设置为"Profile104".
那些DLL位于:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile104\
Run Code Online (Sandbox Code Playgroud)
此PCL配置文件显示为在Visual Studio项目属性中定位这些平台:适用于Windows应用商店应用的.NET,.NET 4.5,Silverlight 4+和Windows 7.5+
解决方案中的每个项目也都通过NuGet引用了Microsoft.Bcl"Microsoft BCL Portability Pack".
所有四个项目都使用MvvmCross(Mvx).
此示例中的所有项目都没有尝试定位与Xamarin Droid/iOS堆栈相关的任何内容.它是所有Windows,并且仍然在await关键字上失败.
带有接口的PCL和Windows Phone类库都使用Mvx CrossCore NuGet包,并设置为"Mvx插件".
"Core"PCL使用完整的MvvmCross NuGet包,并包含发生等待错误的FirstViewModel.
Windows Phone App项目也引用了完整的MvvmCross,并将Windows Phone特定的Mvx文件引入其中.
如上所述,请参阅GitHub上失败的示例代码.
c# base-class-library windows-phone portable-class-library mvvmcross
我正在尝试创建一个利用异步/等待功能集的可移植类库(.NET 4.5/Silverlight 5/Win Phone 8/WinRT).我发现我需要包含Microsoft.Bcl.AsyncNuGet包才能使这个功能正常工作,所以我做到了这一点.显然由于我的目标,我无法访问Task.Delay(0)或Task.FromResult(0).我想知道下一个最好的选择是什么?
目前,我正在使用:( new Task(() => { })基本上,一个不执行任何操作的任务.)
我不确定这是否与前面提到的模式中的任何一个最佳等效.
更新:显然我是盲目的,并没有TaskEx在我的intellisense菜单中看到.我打开这个问题所以人们知道它就在那里,只是因为我的intellisense自动完成而容易错过TaskExtensions.
.net c# base-class-library async-await portable-class-library
我已经阅读了Evolving the Reflection API博客文章,并且当我在PCL中包含"旧"API时,我已经转换了大部分代码,但我无法找到IsInstanceOfType或等同于Type或TypeInfo.它是非常常用的,所以我怀疑它是在新的API下完全丢弃所以我打赌功能刚刚被重命名或折叠在一起其他功能,我只是没有看到它.
c# system.reflection base-class-library portable-class-library
我注意到System.Tuple.CreateF#中方法的一个非常奇怪的行为.查看MSDN文档时,它表明返回类型是System.Tuple<T>.但是在F#中使用此方法时除了Tuple.Create(T)将返回所有重载'T1 * 'T2.显然调用Tuple<T>构造函数将返回Tuple<T>.但我不明白Tuple.CreateF#的返回类型是如何不同的.
c# ×8
.net ×4
clr ×2
async-await ×1
asyncsocket ×1
c#-3.0 ×1
c#-4.0 ×1
c++ ×1
f# ×1
immutability ×1
mvvmcross ×1
nullable ×1
tcpclient ×1
tuples ×1