请参阅以下代码段:
(IEnumerable<object>)new Dictionary<string, string>()
Run Code Online (Sandbox Code Playgroud)
上面的强制转换将抛出无效的强制转换异常.
实际上,IDictionary<TKey, TValue>
也间接实现IEnumerable<out T>
,因为它也实现了ICollection<T>
.也就是说,整个演员应该是有效的.
事实上,对我来说更奇怪的是,如果我在调试器手表插槽上运行整个演员,它就可以了!
这是怎么回事?
我收到以下运行时错误:
[InvalidOperationException: The current runtime target framework is not compatible with 'TestDeployProject'.
Current runtime Target Framework: 'DNX,Version=v4.5 (dnx45)'
Type: CLR
Architecture: x86
Version: 1.0.0-beta6-12256
Please make sure the runtime matches a framework specified in project.json]
Run Code Online (Sandbox Code Playgroud)
项目设置DNX SDK版本:
project.json
目标框架:
"frameworks": {
"dnx46": { }
},
Run Code Online (Sandbox Code Playgroud)
DNVM列表:
Active Version Runtime Architecture OperatingSystem Alias
------ ------- ------- ------------ --------------- -----
1.0.0-beta6 clr x64 win
* 1.0.0-beta6 clr x86 win latest
1.0.0-beta6 coreclr x64 win default
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?
编辑:
我曾尝试在指定使用dnx451 这个职位.同样的问题.环境变量也没有帮助.
有没有办法让GC完全保留一段代码?我在其他类似问题中找到的唯一的事情是GC.TryStartNoGCRegion
它只限于你指定的内存量本身仅限于短暂段的大小.
有没有办法完全绕过它并告诉.NET "分配你需要的任何东西,不做GC期间"或增加段的大小?从我发现它在许多核心服务器上最多1GB,这比我需要分配的少,但我不希望GC发生(我有多达TB的空闲RAM,并且有数千个GC峰值在那一节中,我非常乐意将这些内容换成RAM使用量的10倍甚至100倍.
现在有了赏金,我认为如果我指定用例就更容易了.我正在使用LINQ to XML加载和解析一个非常大的XML文件(现在1GB,很快就会12GB)到内存中的对象.我不是在寻找替代方案.我正在创建数以百万计的数百万个小对象,XElements
并且GC正试图不间断地收集,而我很高兴保持所有RAM用完.我有100英镑的内存,一旦它达到4GB使用,GC开始收集不间断,这是非常友好的内存,但性能不友好.我不关心记忆但我关心表现.我想采取相反的权衡.
虽然我不能在这里发布实际代码是一些非常接近最终代码的示例代码,可以帮助那些要求更多信息的人:
var items = XElement.Load("myfile.xml")
.Element("a")
.Elements("b") // There are about 2 to 5 million instances of "b"
.Select(pt => new
{
aa = pt.Element("aa"),
ab = pt.Element("ab"),
ac = pt.Element("ac"),
ad = pt.Element("ad"),
ae = pt.Element("ae")
})
.Select(pt => new
{
aa = new
{
aaa = double.Parse(pt.aa.Attribute("aaa").Value),
aab = double.Parse(pt.aa.Attribute("aab").Value),
aac = double.Parse(pt.aa.Attribute("aac").Value),
aad = double.Parse(pt.aa.Attribute("aad").Value),
aae = double.Parse(pt.aa.Attribute("aae").Value)
},
ab = new
{
aba = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试Portable Class Library
使用ASP.NET Core 1.0
以下指令编写代码:
public static void WriteMessage<T>(T value)
{
if (typeof(T).IsEnum)
{
Debug.Print("Is enum")
}
else
{
Debug.Print("Not Is enum")
}
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码没有编译,因为编译器说IsEnum
Type上没有属性.
有什么建议?
我正在调查一些奇怪的对象生命周期问题,并遇到了C#编译器的这种非常令人费解的行为:
考虑以下测试类:
class Test
{
delegate Stream CreateStream();
CreateStream TestMethod( IEnumerable<string> data )
{
string file = "dummy.txt";
var hashSet = new HashSet<string>();
var count = data.Count( s => hashSet.Add( s ) );
CreateStream createStream = () => File.OpenRead( file );
return createStream;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器生成以下内容:
internal class Test
{
public Test()
{
base..ctor();
}
private Test.CreateStream TestMethod(IEnumerable<string> data)
{
Test.<>c__DisplayClass1_0 cDisplayClass10 = new Test.<>c__DisplayClass1_0();
cDisplayClass10.file = "dummy.txt";
cDisplayClass10.hashSet = new HashSet<string>();
Enumerable.Count<string>(data, new Func<string, bool>((object) cDisplayClass10, __methodptr(<TestMethod>b__0)));
return new …
Run Code Online (Sandbox Code Playgroud) 还有一个类似的问题这在这里,但我相信,涉及不同的原因.
我把一个班级从一个较新的项目搬到了一个较旧的项目中.两者都针对.net 4.6然而在移动后我在构建时收到以下错误.
C#5中不提供"插值字符串"功能.请使用语言版本6或更高版本.
我尝试将项目设置为在属性窗口中使用C#6进行构建而不做任何更改.
我使用.NET Framework中实现的集合类型做了一些基准测试.
从参考源我知道List<T>
使用数组来存储内容.为避免每次插入时调整数组大小,每次可用空间用完时,数组长度都会加倍.
根据我的理解,除了需要重新分配内部数组的情况外,图表应该是严格不变的.这种行为是否有任何原因,可能与CLR或Windows内存管理/内存碎片有关? 基准测试在Windows 10/i7-3630QM机器上以64位应用程序执行(源代码如下所示).由于单个添加操作无法测量,因此我创建了1000个列表,并为每个列表大小添加了一个项目.
Run Code Online (Sandbox Code Playgroud)
for (int i = 1; i <= MaxCollectionSize; i++)
{
// Reset time measurement
TestContainer.ResetSnapshot();
// Enable time measurement
TestContainer.BeginSnapshot();
// Execute one add operation on 1000 lists each
ProfileAction.Invoke(TestContainer);
TestContainer.EndSnapShot();
double elapsedMilliseconds = (TestContainer.GetElapsedMilliSeconds() / (double)Stopwatch.Frequency) * 1000;
// ...
}
编辑:我仔细检查了我的结果,是的,它们是可重复的.我将测试的集合数量从1000增加到10000,结果现在更加平滑(见下图).现在可以清楚地看到调整内部阵列大小的尖峰.然而在图中的步骤仍然存在-这是与预期的O(1)复杂性的阵列插入应该是,如果你忽略调整大小存在分歧.
我还尝试在每次Add
操作之前触发GC集合,图表保持完全相同.
关于创建委托对象的问题:我的所有委托(例如ProfileAction
)都是在一个完整的测试周期中保持分配的实例属性,在这种情况下是10000个列表,每个列表有1000个添加操作.
错误:"为部署选择的OS*中没有上载软件包所需的名为NetFx46的功能."
简介:在库方法中,何时应该使用async
和await
关键字而不是Task
直接返回?
我相信我的问题与此问题有关.但是,这个问题是关于.NET 4.0
和TPL,而我正在使用.NET 4.6 async
和await
关键字.所以,我认为我的问题可能得到不同的答案,因为在回答链接问题时这些关键字不存在.
说明:我正在为外部WCF服务编写一个简单的包装器,并且包装器会进行多次SendAsync
调用.现在我认为每个包装器方法都应该直接返回Task<>
,而不必等待.我的理解是async
/ await
应该在应用层上使用,而不是在库中.
因此,例如,我认为我应该为每个包装器方法采用的方法:
private Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
return _service.SendAsync(request);
}
Run Code Online (Sandbox Code Playgroud)
但是在互联网上,我找到了几个使用这种方法的帖子:
private async Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
return await _service.SendAsync(request).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
这是我在technet上找到的另一个例子:
async Task PutTaskDelay()
{
await Task.Delay(5000);
}
private async void btnTaskDelay_Click(object sender, EventArgs e)
{
await PutTaskDelay();
MessageBox.Show("I am back");
}
Run Code Online (Sandbox Code Playgroud)
那么,我何时应该使用第二种方法(包含 …
我有一个WPF
.NET 4.6
在Windows 8.1
平板电脑上运行的应用程序,在过去的几天里,我一直在努力使我的应用程序touch
友好,使其按预期工作.我的主要问题是焦点相关,这些影响我的应用程序中的几个控件.例如:
我在寻找解决方案时尝试了几种方法,每种解决方案都有自己的缺点:
最近微软宣布 "Touch更好"但我找不到任何关于解决这个问题的最佳方法的官方文档.
关于如何通过触摸使我的应用程序更好地工作的任何建议都将是一个很大的帮助.
.net-4.6 ×10
c# ×8
.net ×4
asp.net-core ×2
c#-6.0 ×2
arrays ×1
async-await ×1
asynchronous ×1
azure ×1
casting ×1
closures ×1
dnvm ×1
dnx ×1
enums ×1
lambda ×1
performance ×1
touch ×1
windows-8.1 ×1
wpf ×1