我有一项任务,我想一遍又一遍地运行.我想尽可能快地调用它,但是我想保持我的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) 我遇到的问题是我的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>它似乎做工精细..我失去了什么?
如何动态删除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)
删除姓名的正确方法是什么?
我正在试图找出处理单击按钮点击触发的后台工作人员的最佳方法.我用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) 我有一个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)
如何确定他们是否同时按下?
我正在尝试解析一个文件,该文件具有一个我认为长度为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异常.解析这个的正确方法是什么?