标签: .net-4.6

为什么将IDictionary <TKey,TValue>上传到IEnumerable <object>会失败?

请参阅以下代码段:

(IEnumerable<object>)new Dictionary<string, string>()
Run Code Online (Sandbox Code Playgroud)

上面的强制转换将抛出无效的强制转换异常.

实际上,IDictionary<TKey, TValue>也间接实现IEnumerable<out T>,因为它也实现了ICollection<T>.也就是说,整个演员应该是有效的.

事实上,对我来说更奇怪的是,如果我在调试器手表插槽上运行整个演员,它就可以了!

在此输入图像描述

这是怎么回事?

.net c# casting c#-6.0 .net-4.6

19
推荐指数
1
解决办法
889
查看次数

DNX:当前的运行时目标框架与项目不兼容

我收到以下运行时错误:

[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版本:

解决方案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 这个职位.同样的问题.环境变量也没有帮助.

visual-studio-2015 .net-4.6 dnx dnvm asp.net-core

18
推荐指数
1
解决办法
6978
查看次数

在一段代码中将GC置于保持状态

有没有办法让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)

.net c# garbage-collection .net-4.6

17
推荐指数
1
解决办法
495
查看次数

可移植类库中的Type.IsEnum属性

我正在尝试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)

但是这段代码没有编译,因为编译器说IsEnumType上没有属性.

有什么建议?

c# enums .net-4.6 asp.net-core

17
推荐指数
1
解决办法
3271
查看次数

这个闭包组合行为是C#编译器的错误吗?

我正在调查一些奇怪的对象生命周期问题,并遇到了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)

c# lambda closures .net-4.6

16
推荐指数
2
解决办法
544
查看次数

C#5中不提供"插值字符串"功能.请使用语言版本6或更高版本

还有一个类似的问题这在这里,但我相信,涉及不同的原因.

我把一个班级从一个较新的项目搬到了一个较旧的项目中.两者都针对.net 4.6然而在移动后我在构建时收到以下错误.

C#5中不提供"插值字符串"功能.请使用语言版本6或更高版本.

我尝试将项目设置为在属性窗口中使用C#6进行构建而不做任何更改.

c# c#-6.0 .net-4.6

16
推荐指数
4
解决办法
1万
查看次数

C#是否存储大于512长(4096字节)的数组?

我使用.NET Framework中实现的集合类型做了一些基准测试.

从参考源我知道List<T>使用数组来存储内容.为避免每次插入时调整数组大小,每次可用空间用完时,数组长度都会加倍.

大小 -  <code>long</code>值插入到a中<code>List</code>(参见上图中的大小 - 时间 - 图表).列表大小(如128或256)中存在明显的

根据我的理解,除了需要重新分配内部数组的情况外,图表应该是严格不变的.这种行为是否有任何原因,可能与CLR或Windows内存管理/内存碎片有关?

基准测试在Windows 10/i7-3630QM机器上以64位应用程序执行(源代码如下所示).由于单个添加操作无法测量,因此我创建了1000个列表,并为每个列表大小添加了一个项目.

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;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

编辑:我仔细检查了我的结果,是的,它们是可重复的.我将测试的集合数量从1000增加到10000,结果现在更加平滑(见下图).现在可以清楚地看到调整内部阵列大小的尖峰.然而在图中的步骤仍然存在-这是与预期的O(1)复杂性的阵列插入应该是,如果你忽略调整大小存在分歧.

我还尝试在每次Add操作之前触发GC集合,图表保持完全相同.

关于创建委托对象的问题:我的所有委托(例如ProfileAction)都是在一个完整的测试周期中保持分配的实例属性,在这种情况下是10000个列表,每个列表有1000个添加操作.

在此输入图像描述

.net c# arrays performance .net-4.6

15
推荐指数
2
解决办法
628
查看次数

使用.net 4.6发布Azure云服务时出错

错误:"为部署选择的OS*中没有上载软件包所需的名为NetFx46的功能."

azure azure-cloud-services .net-4.6

15
推荐指数
1
解决办法
1590
查看次数

始终在库中的异步方法中使用"async"和"await"关键字?

简介:在库方法中,何时应该使用asyncawait关键字而不是Task直接返回?

我相信我的问题与问题有关.但是,这个问题是关于.NET 4.0和TPL,而我正在使用.NET 4.6 asyncawait关键字.所以,我认为我的问题可能得到不同的答案,因为在回答链接问题时这些关键字不存在.

说明:我正在为外部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)

那么,我何时应该使用第二种方法(包含 …

.net c# asynchronous async-await .net-4.6

14
推荐指数
1
解决办法
2163
查看次数

WPF和触摸 - 焦点问题

我有一个WPF .NET 4.6Windows 8.1平板电脑上运行的应用程序,在过去的几天里,我一直在努力使我的应用程序touch友好,使其按预期工作.我的主要问题是焦点相关,这些影响我的应用程序中的几个控件.例如:

  • 文本框:有时需要双击或三击以获得输入焦点,它们确实输入鼠标悬停状态但插入符号不存在;
  • 组合框:为了打开它,需要进行几次触摸,一旦触摸项目以便选择它,组合将保持打开状态,新选择的项目会突出显示;
    组合框焦点问题
  • 按钮:只需点击几下即可运行连接命令并保持鼠标悬停状态;
  • 键盘支持

我在寻找解决方案时尝试了几种方法,每种解决方案都有自己的缺点:

  • 删除整个应用程序的平板电脑支持(从此处获取).这一个解决了上面提到的大多数焦点问题,但使滚动(我猜其他一些与平板电脑相关的功能,我还没有找到)无法使用.
  • 需要时显式激活键盘(此处示例).焦点问题仍然存在,滚动按预期工作
  • 我还尝试删除所有样式并测试了来自不同制造商的2种不同平板电脑上的所有内容但没有成功

最近微软宣布 "Touch更好"但我找不到任何关于解决这个问题的最佳方法的官方文档.

关于如何通过触摸使我的应用程序更好地工作的任何建议都将是一个很大的帮助.

c# wpf touch windows-8.1 .net-4.6

13
推荐指数
1
解决办法
1630
查看次数