请教各位线程互斥的问题。
(1)多个线程异步调用同一个静态函数,这个静态函数需要设置线程互斥吗?如果需要,麻烦指点一下比较好的实现方式。
(2)我这样控制线程,应该不会无故停止吧?(事实上在调试时曾无故停止过,不知什么原因)
public void RunETV()
{
while(ETVState)
{
//线程的所有动作
}
}
ETVState是在主线程中控制的变量。
(3)各位谁有异步委托技术的详细资料拜托给我发一份,高分相赠。wxyf3222@sina.com
------解决方案--------------------http://topic.csdn.net/t/20050802/17/4184140.html
http://www.autohm.com.cn/development/p401/J40149292.shtml
http://www.zaoxue.com/article/tech-27554.htm
http://hi.baidu.com/guanwei/blog/item/ee5001e92b02303cb80e2d22.html
http://www.cnblogs.com/wenwuxianren/archive/2008/04/17/1158504.html
------解决方案--------------------最简单的就是
在要调用的部分,使用一个lock即可。
可查看
MSDN “示例 ”“Visual C# 示例 ” “线程示例”
------解决方案--------------------while(ETVState)
{
//线程的所有动作
}
你这样写肯定不会同步的,因为判断ETVState时不能用指令完成
------解决方案--------------------调用同一个静态函数要看函数是否有共享资源的读写,如果只是读就问题不大,如果要写,最好用信号量来锁定资源。
工作线程的循环最好不要用bool变量或者死循环配合sleep控制,用信号量等待的方式控制
异步委托可以参考backgroundWorker类
------解决方案--------------------MARK 楼上说的有道理
------解决方案--------------------(1)多个线程异步调用同一个静态函数,这个静态函数需要设置线程互斥吗?如果需要,麻烦指点一下比较好的实现方式。
==================================
CLR的静态函数,静态类访问机制,已经保证的它们都是线程安全的,不需要再设置线程同步锁了。。《VIA IN C#》中有这方面的讨论。
你看看这个,但愿对你有点帮助
http://blog.csdn.net/commandos/archive/2008/03/31/2233680.aspx
(2)我这样控制线程,应该不会无故停止吧?(事实上在调试时曾无故停止过,不知什么原因)
public void RunETV()
{
while(ETVState)
{
//线程的所有动作
}
}
ETVState是在主线程中控制的变量。
==============================================
无故停止,可能是因为ETVState 被设置为false
------解决方案--------------------可以用lock,或者
Public Sub addPstWork(ByRef pst As String)
Dim m As New Mutex
m.WaitOne()
Try
searchPst.renderListBox(pst)
Finally
m.ReleaseMutex()
End Try
End Sub
------解决方案--------------------网上这方面的资料很多的!!
一搜一大片!!
------解决方案--------------------
给你写一段示范代码吧
C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication7
{
public partial class Form1 : Form
{
System.Threading.ManualResetEvent eventObj = new System.Threading.ManualResetEvent(false);
private void invokeThread()
{
//等待1000ms,如果没有收到终止信号则工作
while (eventObj.WaitOne(1000,false) == false)
{
Console.WriteLine(Guid.NewGuid());
}
}
public Form1()
{
InitializeComponent();
}
//开始
private void button1_Click(object sender, EventArgs e)
{
new System.Threading.Thread(new System.Threading.ThreadStart(invokeThread)).Start();
}
//停止
private void button2_Click(object sender, EventArgs e)
{
eventObj.Set();
}
//退出前停止
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
eventObj.Set();
}
}
}
------解决方案--------------------