跳到主要内容

Csharp计算线程运行时间

C#操作数据库进行增删改查

sender

sender最终会被转换为触发该事件的控件。

eg:

private void Button_Click(object sender, RoutedEventArgs e)
{
//……blahblahblah
}

在上例中sender就是button按钮,类型是object,后续将sender就行类型转换就可以得到button,进而对button的属性进行修改。

object是事件的激发控件,或叫事件源。

e是事件参数,也就是说定义事件的类里。

Button button=sender as Button;
//其他控件与此类似

当有多个控件需要触发相同的事件时,使用sender来获取当前触发事件的控件,可以在同一个方法中进行事件的响应,能够使代码的重用性提高,也能更简洁,eg:

private void btnObj1_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button)sender;
if(btn == btnObj1)
{
MessageBox.Show("Btn1 被点击了");
}
else
{
MessageBox.Show("Btn2 被点击了");
}
}

event and delegate

delegate可以理解为C语言中的函数指针。

C#中的事件处理实际上是一种具有特殊签名的delegate。

eg:

//sender代表事件发送者,e是事件参数类
public delegate void MyEventHandler(object sender, MyEventArgs e);

csharp IEnumberable用法

IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。任何支持GetEnumerator()方法的类型都可以通过foreach结构进行运算。

IEnumberable<string> test=new IEnumberable<string>();
string[] temp=test.ToArray();

csharp 多线程

使用多线程的要点,如何对任务进行划分。

Thread 类

bool done=false;
Thread thread=new Thread(()=>{
//do something
done=true;//线程是否运行结束
});
thread.IsBackround=true;//设置后台运行
while(!done){
Thread.Sleep(5);
Application.DoEvents();
}

Task类

Task task=new Task(()=>{
//do something
});
task.start();
if(task.IsCompleted){
//done
}
Task task=Task.Factory.StartNew();