小编poc*_*oco的帖子

Backgroundworker睡眠减少CPU

我有一项任务,我想一遍又一遍地运行.我想尽可能快地调用它,但是我想保持我的cpu周期较低.我在后台工作中使用Sleep阅读并不是最佳选择.然而,没有睡眠,我的CPU保持在55%左右.我在下面有一个我的源代码示例.如果睡眠合适,你如何选择最佳睡眠时间,正如你从我的结果中可以看到的,根据我睡多久,我会得到不同的结果.在做类似的事情时,有人能让我知道最佳做法是什么

BackgroundWorker _Worker = new BackgroundWorker()
{
  WorkerReportsProgress = true,
  WorkerSupportsCancellation = true
};

void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    // do my task here

    // if i uncomment one of the Sleep below I reduce the CPU like so
    // no sleep             CPU = 52-58%
    // Thread.Sleep(1);     CPU = 09-15%
    // Thread.Sleep(10);    CPU = 02-03%
    // Thread.Sleep(100);   CPU = 00-01%
}

void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled) { return; }

    _Worker.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)

c# sleep backgroundworker

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

wpf MVVM ObservableCollection <string>不更新视图

我遇到的问题是我的ObservableCollection没有更新视图.我可以在OnPropertyChange之前放置一个断点,并且可以验证我的集合中是否有名称.

在我的模型中,我有一个事件,它会触发一个带有随机名称的List.

在我的视图模型中,我订阅了这个事件,我的事件处理程序执行此操作

void _manager_ProcessesChanged(List<string> n)
    {
        //create a new collection to hold current Ids
        ObservableCollection<string> names = new ObservableCollection<string>();

        //copy ids into our collection
        foreach (string name in n)
        {
            names.Add(name);
        }

        Names = names;
    }
Run Code Online (Sandbox Code Playgroud)

我的名字属性看起来像这样

ObservableCollection<string> _names = new ObservableCollection<string>();
public ObservableCollection<string> Names
    {
        get { return _names; }
        set
        {
            _names = value;
           OnPropertyChanged("Names");
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的观点绑定看起来像这样

<Window.DataContext>
    <vm:MainWindowViewModel/>
</Window.DataContext>
<Grid>
    <ListBox ItemsSource="{Binding Path=Names}"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

如果我改变了收集<string><int>它似乎做工精细..我失去了什么?

wpf observablecollection mvvm

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

从动态删除ToopStripMenuItem中的项目

如何动态删除ToolStripMenu项.我有两个事件触发一个添加名称,一个删除名称.添加名称有效.删除没有.当我调试我的删除时,我可以在DropDownItems中看到{Poco}.但是,当我调用删除它不会被删除

// Adding items works as expected
ToolStripMenuItem mi = new ToolStripMenuItem("Poco");
mi.CheckOnClick = true;
myToolStripMenuItem.DropDownItems.Add(mi);
Run Code Online (Sandbox Code Playgroud)

我尝试了很多东西..我认为可行的是这个

// This does not work .. how do i fix this?
myToolStripMenuItem.DropDownItems.RemoveByKey("Poco");
Run Code Online (Sandbox Code Playgroud)

删除姓名的正确方法是什么?

c# winforms

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

C#BackgroundWorker - 我应该如何摆脱DoEvents

我正在试图找出处理单击按钮点击触发的后台工作人员的最佳方法.我用3个单选按钮和一个标签创建了一个非常简单的表单.每个单选按钮共享相同的事件radioButton_CheckedChanged.如果事件完成,那么我将标签更新为"完成".如果在事件完成之前单击另一个单选按钮,则将标签更新为已取消.下面是我在这个快速示例中编写的代码.尽管应用程序倾向于按预期运行,但我关注的是使用Application.DoEvents.我有什么替代方案.出于显而易见的原因,我在IsBusy时无法入睡.我是否认为这一切都错了,或者有更好的方法吗?谢谢,poco

private void radioButton_CheckedChanged(object sender, EventArgs e)
{
  RadioButton rb = sender as RadioButton;
            if (rb.Checked)
            {
                if (backgroundWorker1.IsBusy)
                {
                    backgroundWorker1.CancelAsync();
                    while (backgroundWorker1.IsBusy)
                        Application.DoEvents();
                }

                backgroundWorker1.RunWorkerAsync();
            }
        }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            for (int i = 0; i < 100 && !worker.CancellationPending; ++i)
                Thread.Sleep(1);

            if (worker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
                label1.Text = "Canceled";
            else
                label1.Text = "Complete";
        }
Run Code Online (Sandbox Code Playgroud)

c# backgroundworker doevents

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

C#如何从文本框中捕获Ctrl-R

我有一个from文本框,我正在尝试确定是否在此文本框内按下了Ctrl-R。我可以使用以下方法分别检测按键:

private void CheckKeys(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if(e.KeyChar == (char)Keys.R)
    {
        // ...
    }
    if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如何确定他们是否同时按下?

c# keystroke

0
推荐指数
1
解决办法
2931
查看次数

如何将8字节十六进制转换为DateTime

我正在尝试解析一个文件,该文件具有一个我认为长度为8个字节的时间戳,在十六进制中看起来像这样

00 00 00 00 DE A4 4F 4F

当我将其解析为Int64时,我没有收到正确的日期/时间.但是,如果我跳过前4个字节并执行类似的操作,我会得到正确的日期时间.

TimeSpan span = TimeSpan.FromTicks(BitConverter.ToInt32(bytes.Skip(index).Take(8).ToArray(),4) * TimeSpan.TicksPerSecond);
DateTime t = new DateTime(1970, 1, 1).Add(span);
StartTime = TimeZone.CurrentTimeZone.ToLocalTime(t);
Run Code Online (Sandbox Code Playgroud)

但是我不确定我要解析的下一个文件是否会有前4个字节的前导00.如果我将其解析为ToInt64,我会抛出一个outOfRange异常.解析这个的正确方法是什么?

c# datetime

0
推荐指数
1
解决办法
7292
查看次数