小编Ert*_*maa的帖子

.NET局部变量优化

当我发现这个时,我正在阅读.NET源代码:

// Constructs a Decimal from an integer value.
//
public Decimal(int value) {
    //  JIT today can't inline methods that contains "starg" opcode.
    //  For more details, see DevDiv Bugs 81184: x86 JIT CQ:
    //  Removing the inline striction of "starg".
    int value_copy = value;  
    if (value_copy >= 0) {
        flags = 0;
    }
    else {
        flags = SignMask;
        value_copy = -value_copy;
    }
    lo = value_copy;
    mid = 0;
    hi = 0;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,Decimal结构的构造函数将方法参数复制到局部变量,而不是直接使用它.我想知道评论的含义以及它与性能和优化的关系?

我的猜测是,一旦你想修改现有的参数,方法就不能再内联了?

http://referencesource.microsoft.com/#mscorlib/system/decimal.cs#f9a4da9d6e110054#references

.net c# optimization jit decimal

21
推荐指数
1
解决办法
743
查看次数

Progress <T>没有报告功能

我有windows form app这是我的代码:

  private async void btnGo_Click(object sender, EventArgs e)
    {
        Progress<string> labelVal = new Progress<string>(a => labelValue.Text = a);
        Progress<int> progressPercentage = new Progress<int>(b => progressBar1.Value = b);

       // MakeActionAsync(labelVal, progressPercentage);
        await Task.Factory.StartNew(()=>MakeActionAsync(labelVal,progressPercentage));
        MessageBox.Show("Action completed");
    }

    private void MakeActionAsync(Progress<string> labelVal, Progress<int> progressPercentage)
    {
            int numberOfIterations=1000;
            for(int i=0;i<numberOfIterations;i++)
            {
                Thread.Sleep(10);
                labelVal.Report(i.ToString());
                progressPercentage.Report(i*100/numberOfIterations+1);
            }
    }
Run Code Online (Sandbox Code Playgroud)

我得到编译错误,"System.Progress"不包含'Report'的定义,并且没有扩展方法'Report'接受类型'System.Progress'的第一个参数可以找到(你是否缺少using指令或程序集参考?)"

但是 如果你看一下Progress类:

public class Progress<T> : IProgress<T>
Run Code Online (Sandbox Code Playgroud)

和IProgress接口有功能报告:

  public interface IProgress<in T>
{
    // Summary:
    //     Reports a progress update.
    //
    // Parameters:
    //   value: …
Run Code Online (Sandbox Code Playgroud)

c# winforms async-await

14
推荐指数
2
解决办法
3140
查看次数

固定边距和VW(视口宽度)单位冲突

我有一个容量为40px的填充物.在那个容器里面我有一个图像和文字.

我试图保持图像和文本同步.如果我调整窗口大小,我的图像会自动调整大小,我正在尝试使用单位"vw"来保持我的文本与图像同步,但它并不像我想的那样工作.填充在某种程度上是冲突的,但我不确定正确的解决方案是什么.

这是我的简单示例:

.main {
  padding-left: 20px;
  padding-right: 20px;
  background-color: white;
  position: relative;
}

img {
  width: 100%;
}

.text {
  font-size: 6.8vw;
  position: absolute;
  left: 20%;
  top: 12%;
}
Run Code Online (Sandbox Code Playgroud)
<body>
  <div class="main">

    <img src="http://screenshots.chriseelmaa.com/temp/d_slider_1_1_jpg__1918×880__1F40F570.png" />

    <span class="text">YOUR SHAPE.</span>
  </div>
</body>
Run Code Online (Sandbox Code Playgroud)

JSFiddle:https://jsfiddle.net/zn4odjrc/

如您所见,如果您将浏览器窗口拖得非常小而且非常大,则文本将从图像中移出不同步.我该如何处理计算中的固定保证金?

我尝试过疯狂的东西font-size: calc(3vw - 40px),但没有运气.

//编辑:

在Nils的帮助下,我设法确定了行高和字体大小并得到了这个结果:

https://jsfiddle.net/zn4odjrc/6/

我对结果几乎感到满意,但是我不明白为什么第一个字母没有锚定,当你最小化浏览器真的很小/大时,它会移动很多.

如您所见,顶部和线条高度似乎正确固定.我现在不关心字母间距,但它不是固定在水平轴上,我怀疑它是因为左:20%,这应该是左边的长线:calc(20px +(100% - 40px)*0.3)

html css

14
推荐指数
2
解决办法
1446
查看次数

播放加密视频

我接下来要做的是:我们需要保护视频内容(加密它)并能够播放它.

棘手的部分是我们不想立刻将所有内容加载到内存中并在那里解密.(尽管这也是一种选择)

基本上寻找的是我们从HDD播放加密视频内容的解决方案,这样只有我们的APPLICATIOn才能播放该视频.

然而它应该逐块读取文件(因为如果我们处理2GB文件,它不应该一次性加载到内存中).

请告诉我们,有什么可能的方法?

  • SilverLight4 DRM - 好的,这看起来像是合理的解决方案,足以满足我们的需求.但是,PlayReady SDK售价约为30,000美元,我们不想使用SilverLight.大概是C#或C++

  • 我们有一个想法,就是将大视频文件拆分为单独的加密视频文件(如序列),然后加载每个文件("块")直接存储/解密并从内存中播放(并在序列文件之间交替),这似乎是最简单的,可能是真正做到的.但是,什么库能够从memoryStream播放视频文件?我相信VLC应该能够做到这一点..?

  • 另一个想法是只采用未压缩的AVI,逐帧处理视频,修改每一帧(以某种方式加密),现在当我们播放视频时,我们在内存中重新处理帧并解密它.

  • 只处理一个特定的编解码器并为它编写自定义解决方案 - 实际上这听起来很酷但我担心它会花费我们太多的时间,但请告诉我们这个方法

  • 另一个,使用VLC从localhost播放加密流(例如,APPLICATION将加密的HDD文件流传输到localhost:800/BLAHBLAH),同一个应用程序在那里有VLC控制来解密加密流.我们仍然不知道HDD上的文件是否也可以实际加密(因此用户无法在另一个播放器上播放该文件),而且VLC是GPL,这对我们没有好处.

encryption video playing

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

加载要在WrapPanel中显示的大量图像

我正在使用Entity Framework Code First

我有这样的电影:

public class Movie
{
        public byte[] Thumbnail { get; set; }
        public int MovieId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

电影的集合是这样的:

public class NorthwindContext : DbContext
{
    public DbSet<Movie> Movies { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的MovieViewModel:

public class MovieViewModel
{
        private readonly Movie _movie;

        public MovieViewModel(Movie movie)
        {
            _movieModel = movieModel;
        }

        public byte[] Thumbnail { get { return _movie.Thumbnail; } }
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序启动时:

public ObservableCollection<MovieViewModel> MovieVms = 
                      new ObservableCollection<MovieViewModel>();

foreach …
Run Code Online (Sandbox Code Playgroud)

c# wpf entity-framework ef-code-first

10
推荐指数
2
解决办法
2090
查看次数

如何在resharper插件中动态重写AST?

请求:

我希望能够编写一个分析器,它可以为某个表达式提供代理值并触发重新解析文档.

动机:

我们的代码中充斥着ABTests,它们可以处于已部署或处于活动状态且具有控制和变体组.确定测试的状态是通过数据库查找完成的.对于使用控制组部署的测试,以下表单的任何语句都将计算为false:

if(ExperimentService.IsInVariant(ABTest.Test1))
{
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试提供工具,以便在开发时通过在这种情况下将其变灰来更容易处理.事实上,这是相当有限的,并不健壮,因为我基本上必须自己玩解析器.

如果实际代码是什么

if(!ExperimentService.IsInVariant(ABTest.Test1))
Run Code Online (Sandbox Code Playgroud)

要么

if(ExperimentService.IsInVariant(ABTest.Test1) || true)
Run Code Online (Sandbox Code Playgroud)

要么

var val = ..... && (ExperimentService.IsInVariant(ABTest.Test1);
if(val){
  // val is always going to be false if we deployed control.
}
Run Code Online (Sandbox Code Playgroud)

我可以看到的一种可能的方法是允许我们编写一次触发的分析器并在实际的IDE解析发生之前重写树(或者,好吧,只是再次解析它).这些应该只发射一次并允许我们用另一个表达式替换某个表达式.这将允许我交换所有这些实验调用的真假文字.

因此,这些部分可以从所有其他IDE功能中受益,例如代码灰化无法访问的代码,还有更复杂的代码,例如永远不会有不同值的变量

显然这仅仅是一个例子,我不确定它是多么可行.对于正确的功能或已经存在的东西的任何建议都非常受欢迎.

c# resharper resharper-plugins

10
推荐指数
1
解决办法
113
查看次数

在WPF中以编程方式更改DataGrid单元格值

我有一个DataGrid视图,在运行时通过列表填充它的内容.我想在行中更改(例如)单元格值:2和列:3.

我怎样才能做到这一点?

wpf datagrid

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

MongoDB按辅助查找表排序

我有一个约会应用程序,我将所有潜在的Match对象存储在MongoDB中(当用户向左或向右滑动时会发生Match对象):

{
   uid1: <userid1>,
   uid2: <userid2>,

   uid1action: <L|R|E> (left/right/empty, based what the user1 has done),
   uid2action: <L|R|E> (left/right/empty, based what the user2 has done),
}
Run Code Online (Sandbox Code Playgroud)

现在谈到我的问题.当我向user1显示潜在用户的个人资料时,我会考虑所有已经喜欢user1的人(因为我优先考虑这些个人资料):

var likedQuery = Parse.Query.or(new Parse.Query("Match")
    .equalTo("uid1", userId)
    .equalTo("u2action", "L")
    .equalTo("u1action", "E") // user1 has not done anything
    .select("uid2")
    .limit(paginationLimit);
Run Code Online (Sandbox Code Playgroud)

现在这很好,一切都很好.我现在也希望通过每个用户喜欢的数量(流行度)来订购likesQuery.

说这些是喜欢user1的以下用户:

保罗(保罗本人有50个人喜欢他)

洛根(洛根被20人所喜欢)

迈克尔(迈克尔被80人喜欢),

我们想订购所有这些人,以便迈克尔成为第一个用户看到的个人资料.

现在我的问题是,我将如何使用mongoDB?在SQL中这将是非常简单的,只需执行一个表JOIN,使用SUM()和COUNT()按该表排序,并确保您有必要的索引.

在mongoDB中,我看到如何做的唯一方法是uid2likes在每个Match对象上有一个(将被排序)字段,该字段将由cron作业递增,但这是荒谬的并且不能扩展.

我的问题更多的是关于如何以可扩展的方式做到这一点.

mongodb

6
推荐指数
1
解决办法
218
查看次数

突出显示FlowDocument中的部分文本

我想FlowDocument根据搜索结果突出显示文本的某些部分.我正在做的是获取搜索词在文本中出现的FlowDocument索引,然后在找到的索引处开始的文本范围上应用背景颜色,结束于找到的索引+搜索词长度.

TextRange content = new TextRange(myFlowDocument.ContentStart, 
                                  myFlowDocument.ContentEnd);
List<int> highlights = GetHighlights(content.Text, search);

foreach (int index in highlights)
{
    var start = myFlowDocument.ContentStart;
    var startPos = start.GetPositionAtOffset(index);
    var endPos = start.GetPositionAtOffset(index + search.Length);
    var textRange = new TextRange(startPos, endPos);
    textRange.ApplyPropertyValue(TextElement.BackgroundProperty, 
               new SolidColorBrush(Colors.Yellow));
}

TextRange newRange = new TextRange(myFlowDocument.ContentStart, 
                                   newDocument.ContentEnd);
FlowDocument fd = (FlowDocument)XamlReader.Parse(newRange.Text);
Run Code Online (Sandbox Code Playgroud)

问题是,我正在搜索文档文本中的索引,但是当我返回时,FlowDocument添加了xaml标记,并且我看到了突出显示的内容.我该如何解决?

c# wpf highlight flowdocument

5
推荐指数
1
解决办法
3687
查看次数

WPF 中的嵌入字体不起作用

我有一个 WPF 应用程序,我在其中使用字体“Segoe UI Symbol”中的图标。但是当部署到 Windows 7 时,我意识到图标丢失了,因为字体在 Windows 8 中更新了。

我尝试按照以下说明在 WPF 应用程序中嵌入字体作为资源:http : //msdn.microsoft.com/en-us/library/ms753303.aspx 但它不起作用。

最初我有:

<TextBlock FontFamily="Segoe UI Symbol">
Run Code Online (Sandbox Code Playgroud)

在 Windows 8 计算机上运行良好。然后我将 seguisym.ttf 添加到目录“_Resources”,然后使用:

<TextBlock FontFamily="./_Resources/#Segoe UI Symbol">
Run Code Online (Sandbox Code Playgroud)

这不适用于 Windows 8 或 Windows 7!我为 BuildAction 尝试了不同的设置:Resource、Embedded Resource 和 Content,但它们都不起作用。

c# wpf fonts

5
推荐指数
1
解决办法
4888
查看次数