小编Pau*_*ulG的帖子

C#silverlight中的DispatcherTimer和UI刷新限制

我再次为一个对你们所有人都很简单的问题道歉.我对Silverlight幕后的内容知之甚少.

我有一个图表应用程序(Visiblox),我用它作为滚动范围每20ms更新一次,添加和删除一个点.在伪代码中:

List<Point> datapoints= new List<Point>();
Series series = new Series(datapoints);
void timer_tick(){
  datapoints.Add(new Point);
  datapoints.RemoveAt(0);
  // no need to refresh chart, it does refresh automatically
}
Run Code Online (Sandbox Code Playgroud)

在此图表工具中运行6系列时,它开始显示有点迟缓.将刻度线更改为10毫秒没有任何区别,图表以相同的速度更新,因此似乎20ms是速度限制(UI或图表?).

我试过CompositionTarget.Rendering并得到了相同的结果:在20ms以下,速度没有差别.

然后我意外地启用了两个并且速度加倍.所以我测试了多个线程(2,3,4),速度加倍,三倍和四倍.这还没有锁,因为我甚至不知道生成锁定需要什么进程,但没有数据损坏和内存泄漏.

我的问题是为什么20ms的低速图表不能在10ms运行,但在多线程时速度非常快?UI刷新过程是否运行得更快?图表计算加倍了吗?或者单个DispatcherTimer的执行速度是否有限制?

谢谢!


编辑:我有嵌入式编码的背景,所以当我想到线程和时序时,我立即想到在硬件中切换一个引脚并连接一个范围来测量进程长度.我是C#中的线程新手,没有用于连接范围的引脚.有没有办法以图形方式查看线程时序?

c# silverlight multithreading dispatchertimer visiblox

8
推荐指数
2
解决办法
4484
查看次数

WPF在Closing事件中隐藏窗口阻止应用程序终止

一个简单的问题.

我在WPF中使用一个窗口作为子窗口,我宁愿让"X"按钮隐藏窗口而不是关闭窗口.为此,我有:

private void Window_Closing(object sender, CancelEventArgs e) {
   this.Hide();
   e.Cancel = true;
}
Run Code Online (Sandbox Code Playgroud)

问题是当父窗口关闭时,它永远不会关闭并使应用程序保持活动状态.

有没有一个干净的方法来处理这个?我想到为我的所有用户控件(窗口)添加一个Kill标志:

public bool KillMe;

private void Window_Loaded(object sender, RoutedEventArgs e){
   KillMe = false;
}

private void Window_Closing(object sender, CancelEventArgs e) {
   this.Hide();
   if (!KillMe) e.Cancel = true;
}
Run Code Online (Sandbox Code Playgroud)

然后在MainWindow_Closing()中,我必须将所有窗口KillMe标志设置为true.

还有什么比创建额外标志更好的方法而忘记在关闭之前设置它们?

c# wpf window hide

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

如何通过对象指针调用C#对象方法/更改字段?

这是一个简单的问题(这里是C#noob),我找不到如何做到这一点(我有Schildt的C#4.0参考,但不确定我在寻找什么).

假设我有两个不同类创建的对象,但是具有相同名称的字段和/或方法.例如:

public class Object1 {
  bool enable;
  public void Reset(){
    enable = false;
  }
}

public class Object2 {
  bool enable;
  public void Reset(){
    enable = false;
  }
}
Run Code Online (Sandbox Code Playgroud)

对象非常不同,证明了创建两个不同对象的合理性.但是,我有许多具有常见'enable'字段和'Reset()'方法的对象.

所以这就是我想要做的事情(伪代码或其他任何东西):

void Manipulate(ref object pObj){
  (pObj).enable = true;
  (pObj).Reset();
}

void Main(){
  Manipulate(obj1);
  Manipulate(obj2);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我不知道如何创建一个可以指向来自不同类的对象的对象.

谢谢!


感谢所有的答案.我浏览了接口并将它们理解为"别名",并且无法弄清楚它们的用处是什么.

c#

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

使用Parse()对任何具有Parse实现的T进行C#数据验证

我正在简化我的代码(我喜欢为每个执行的函数编写最少量的行),而且我经常遇到冗长的数据验证过程.所以决定用伪代码编写一个Validate函数:

public static bool Validate(string input, out object output){
   // try to parse data
   try {
     (TypeOf(object)) output = new (TypeOf(object));
     output = (TypeOf(object)).Parse(input);
     return true;
   } catch {
     return false;
   }   
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我在我的代码中使用它来验证几个文本框,它看起来很好并且非常易读:

double var1;
Int32 var2;
byte var3;
if (!Validate(txtDouble.text, var1)) return "Error validating a Double";
if (!Validate(txtInt32.text, var2)) return "Error validating a Int32";
if (!Validate(txtByte.text, var3)) return "Error validating a byte";
// else all data is valid, continue
Process(var1, var2, var3)
Run Code Online (Sandbox Code Playgroud)

我可以为每种类型创建一个静态类Validate和重载,但由于我打算在包含Parse方法的类型上使用,在我看来应该有一种实现上述功能的方法...我只是不要知道我在找什么.一个接口不断出现在我的脑海中,但未能实现.

谢谢!

c# validation

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