多线程同步的问题 InvokeThread里面没做线程同步~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 多线程?LZ你用的多CPU的机器?CPU原理在同一时间,只运行一个线程 private static object obj1 = new object(); private static object obj2 = new object(); private static object obj3 = new object(); private void InvokeThread(object i) { try { if (this.InvokeRequired) { lock (obj1) { this.Invoke(new myDelegate(Excute1), new object[] { i }); } } else { lock (obj2) { Excute1(i); } } } catch (Exception ex) { lock (obj3) { log.Debug(ex.Message); } } } 照Hide1984改了之后,变成单线程了我的意思的 多线程对不同的文件进行操作,每个线程同时对不同的文件操作,提高效率 ....你需要怎样的多线程,如果你输出线程的执行情况,每个瞬间当然只有一个线程能拿到时间片。所以才有所谓的线程同步。难道你想同一时间内多个线程同时去执行一个操作??? 那是不可能的。多线程只是宏观的,对于CPU来说,永远是每个时间片内只有一个线程能拿到操作权。如果你想看当前是哪个线程在操作,那么for (int i = 0; i < ThreadCount; i++) { System.Threading.Thread thread = new System.Threading.Thread(this.InvokeThread); thread.name = "thread"+(i+1); thread.Start(i); }try { if (this.InvokeRequired) { lock (obj1) { this.Invoke(new myDelegate(Excute1), new object[] { i }); Console.WriteLine(Thread.CurrentThread.Name); } } else { lock (obj2) { Excute1(i); Console.WriteLine(Thread.CurrentThread.Name); } } } catch (Exception ex) { lock (obj3) { log.Debug(ex.Message); Console.WriteLine(Thread.CurrentThread.Name); } } 这是我以前写的,楼主看看 【多线程从100减到1】 class ThreadDemo { static object a = new object(); static int i = 100; public static void Main() { Thread threadOne = new Thread(new ThreadStart(Process)); Thread threadTwo = new Thread(new ThreadStart(Process)); threadOne.Name = "线程1"; threadTwo.Name = "线程2"; threadOne.Start(); threadTwo.Start(); Console.ReadKey(); } static private void Process() { while (i > 0) { lock (a) { if (i > 0) { i--; Console.WriteLine(Thread.CurrentThread.Name + "减1 ====> i = " + i); } } } } } 运行结果 线程1减1 ====> i = 99 线程2减1 ====> i = 98 线程2减1 ====> i = 97 线程2减1 ====> i = 96 线程2减1 ====> i = 95 线程2减1 ====> i = 94 线程2减1 ====> i = 93 线程2减1 ====> i = 92 线程2减1 ====> i = 91 线程2减1 ====> i = 90 线程2减1 ====> i = 89 线程2减1 ====> i = 88 线程2减1 ====> i = 87 线程2减1 ====> i = 86 线程2减1 ====> i = 85 线程2减1 ====> i = 84 线程2减1 ====> i = 83 线程2减1 ====> i = 82 线程2减1 ====> i = 81 线程2减1 ====> i = 80 线程2减1 ====> i = 79 线程2减1 ====> i = 78 线程2减1 ====> i = 77 线程2减1 ====> i = 76 线程2减1 ====> i = 75 线程2减1 ====> i = 74 线程2减1 ====> i = 73 线程2减1 ====> i = 72 线程2减1 ====> i = 71 线程1减1 ====> i = 70 线程1减1 ====> i = 69 线程1减1 ====> i = 68 线程1减1 ====> i = 67 线程1减1 ====> i = 66 线程1减1 ====> i = 65 线程2减1 ====> i = 64 线程2减1 ====> i = 63 线程2减1 ====> i = 62 线程2减1 ====> i = 61 线程2减1 ====> i = 60 线程1减1 ====> i = 59 线程1减1 ====> i = 58 线程1减1 ====> i = 57 线程1减1 ====> i = 56 线程1减1 ====> i = 55 线程1减1 ====> i = 54 线程2减1 ====> i = 53 线程2减1 ====> i = 52 线程2减1 ====> i = 51 线程2减1 ====> i = 50 线程2减1 ====> i = 49 线程2减1 ====> i = 48 线程2减1 ====> i = 47 线程2减1 ====> i = 46 线程2减1 ====> i = 45 线程2减1 ====> i = 44 线程2减1 ====> i = 43 线程1减1 ====> i = 42 线程1减1 ====> i = 41 线程1减1 ====> i = 40 线程1减1 ====> i = 39 线程1减1 ====> i = 38 线程1减1 ====> i = 37 线程2减1 ====> i = 36 线程2减1 ====> i = 35 线程2减1 ====> i = 34 线程2减1 ====> i = 33 线程2减1 ====> i = 32 线程2减1 ====> i = 31 线程2减1 ====> i = 30 线程2减1 ====> i = 29 线程2减1 ====> i = 28 线程1减1 ====> i = 27 线程1减1 ====> i = 26 线程1减1 ====> i = 25 线程1减1 ====> i = 24 线程1减1 ====> i = 23 线程2减1 ====> i = 22 线程2减1 ====> i = 21 线程2减1 ====> i = 20 线程2减1 ====> i = 19 线程2减1 ====> i = 18 线程2减1 ====> i = 17 线程1减1 ====> i = 16 线程1减1 ====> i = 15 线程1减1 ====> i = 14 线程1减1 ====> i = 13 线程1减1 ====> i = 12 线程1减1 ====> i = 11 线程1减1 ====> i = 10 线程2减1 ====> i = 9 线程2减1 ====> i = 8 线程2减1 ====> i = 7 线程2减1 ====> i = 6 线程2减1 ====> i = 5 线程2减1 ====> i = 4 线程2减1 ====> i = 3 线程2减1 ====> i = 2 线程1减1 ====> i = 1 线程1减1 ====> i = 0 学习中,让我理清下思路感谢Hide1984 我的思路的,先定义一个委托,再循环出N个线程,分别Invoke给委托进行处理,这个思路难道不行吗?这样一个线程控制一个方法,多线程不就是多个委托事件了吗? 对于不可再分的耗时操作, 可以用异步线程或异步委托来做,避免UI阻塞lz的例子就是这种情况 SmartThreadPool http://www.codeproject.com/KB/threads/smartthreadpool.aspx 还是麻烦给个例子吧,感觉AutoResetEvent不是我要的结果 如何实现根据分辨率自动调整winform控件大小 求分页取数据技巧 Access关键字查询时无记录 我的人体彩绘摄影作品,欢迎回帖 关于在线反馈计分的问题 程序打包后,无法连接数据库问题 用.NET开发类似输入法的功能 c#手工生成XML的问题! 在线等,MSSQL数据库表的创建,增加字段,增加字段类型的C#原码!! 怎样在javascrip中触发页面上的一个按钮 crstalreportview 打印 sql多种情况返回一个值问题
LZ你用的多CPU的机器?
CPU原理在同一时间,只运行一个线程
private static object obj1 = new object();
private static object obj2 = new object();
private static object obj3 = new object(); private void InvokeThread(object i)
{ try
{
if (this.InvokeRequired)
{
lock (obj1)
{
this.Invoke(new myDelegate(Excute1), new object[] { i });
}
}
else
{
lock (obj2)
{
Excute1(i);
}
} }
catch (Exception ex)
{
lock (obj3)
{
log.Debug(ex.Message);
}
}
}
所以才有所谓的线程同步。
难道你想同一时间内多个线程同时去执行一个操作??? 那是不可能的。
多线程只是宏观的,对于CPU来说,永远是每个时间片内只有一个线程能拿到操作权。如果你想看当前是哪个线程在操作,那么for (int i = 0; i < ThreadCount; i++)
{
System.Threading.Thread thread = new System.Threading.Thread
(this.InvokeThread);
thread.name = "thread"+(i+1);
thread.Start(i);
}
try
{
if (this.InvokeRequired)
{
lock (obj1)
{
this.Invoke(new myDelegate(Excute1), new object[] { i });
Console.WriteLine(Thread.CurrentThread.Name);
}
}
else
{
lock (obj2)
{
Excute1(i);
Console.WriteLine(Thread.CurrentThread.Name);
}
} }
catch (Exception ex)
{
lock (obj3)
{
log.Debug(ex.Message);
Console.WriteLine(Thread.CurrentThread.Name);
}
}
这是我以前写的,楼主看看 【多线程从100减到1】 class ThreadDemo
{
static object a = new object();
static int i = 100;
public static void Main()
{
Thread threadOne = new Thread(new ThreadStart(Process));
Thread threadTwo = new Thread(new ThreadStart(Process));
threadOne.Name = "线程1";
threadTwo.Name = "线程2";
threadOne.Start();
threadTwo.Start();
Console.ReadKey(); }
static private void Process()
{
while (i > 0)
{
lock (a)
{
if (i > 0)
{
i--;
Console.WriteLine(Thread.CurrentThread.Name + "减1 ====> i = " + i);
}
}
}
}
} 运行结果
线程1减1 ====> i = 99
线程2减1 ====> i = 98
线程2减1 ====> i = 97
线程2减1 ====> i = 96
线程2减1 ====> i = 95
线程2减1 ====> i = 94
线程2减1 ====> i = 93
线程2减1 ====> i = 92
线程2减1 ====> i = 91
线程2减1 ====> i = 90
线程2减1 ====> i = 89
线程2减1 ====> i = 88
线程2减1 ====> i = 87
线程2减1 ====> i = 86
线程2减1 ====> i = 85
线程2减1 ====> i = 84
线程2减1 ====> i = 83
线程2减1 ====> i = 82
线程2减1 ====> i = 81
线程2减1 ====> i = 80
线程2减1 ====> i = 79
线程2减1 ====> i = 78
线程2减1 ====> i = 77
线程2减1 ====> i = 76
线程2减1 ====> i = 75
线程2减1 ====> i = 74
线程2减1 ====> i = 73
线程2减1 ====> i = 72
线程2减1 ====> i = 71
线程1减1 ====> i = 70
线程1减1 ====> i = 69
线程1减1 ====> i = 68
线程1减1 ====> i = 67
线程1减1 ====> i = 66
线程1减1 ====> i = 65
线程2减1 ====> i = 64
线程2减1 ====> i = 63
线程2减1 ====> i = 62
线程2减1 ====> i = 61
线程2减1 ====> i = 60
线程1减1 ====> i = 59
线程1减1 ====> i = 58
线程1减1 ====> i = 57
线程1减1 ====> i = 56
线程1减1 ====> i = 55
线程1减1 ====> i = 54
线程2减1 ====> i = 53
线程2减1 ====> i = 52
线程2减1 ====> i = 51
线程2减1 ====> i = 50
线程2减1 ====> i = 49
线程2减1 ====> i = 48
线程2减1 ====> i = 47
线程2减1 ====> i = 46
线程2减1 ====> i = 45
线程2减1 ====> i = 44
线程2减1 ====> i = 43
线程1减1 ====> i = 42
线程1减1 ====> i = 41
线程1减1 ====> i = 40
线程1减1 ====> i = 39
线程1减1 ====> i = 38
线程1减1 ====> i = 37
线程2减1 ====> i = 36
线程2减1 ====> i = 35
线程2减1 ====> i = 34
线程2减1 ====> i = 33
线程2减1 ====> i = 32
线程2减1 ====> i = 31
线程2减1 ====> i = 30
线程2减1 ====> i = 29
线程2减1 ====> i = 28
线程1减1 ====> i = 27
线程1减1 ====> i = 26
线程1减1 ====> i = 25
线程1减1 ====> i = 24
线程1减1 ====> i = 23
线程2减1 ====> i = 22
线程2减1 ====> i = 21
线程2减1 ====> i = 20
线程2减1 ====> i = 19
线程2减1 ====> i = 18
线程2减1 ====> i = 17
线程1减1 ====> i = 16
线程1减1 ====> i = 15
线程1减1 ====> i = 14
线程1减1 ====> i = 13
线程1减1 ====> i = 12
线程1减1 ====> i = 11
线程1减1 ====> i = 10
线程2减1 ====> i = 9
线程2减1 ====> i = 8
线程2减1 ====> i = 7
线程2减1 ====> i = 6
线程2减1 ====> i = 5
线程2减1 ====> i = 4
线程2减1 ====> i = 3
线程2减1 ====> i = 2
线程1减1 ====> i = 1
线程1减1 ====> i = 0
感谢Hide1984
先定义一个委托,再循环出N个线程,分别Invoke给委托进行处理,
这个思路难道不行吗?
这样一个线程控制一个方法,多线程不就是多个委托事件了吗?
lz的例子就是这种情况