首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

线程互斥的有关问题

2011-12-27 
请教各位线程互斥的问题。(1)多个线程异步调用同一个静态函数,这个静态函数需要设置线程互斥吗?如果需要,麻

请教各位线程互斥的问题。
(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();        }    }}
------解决方案--------------------


如果这个操作需要进行数据同步的话建议lock否则回死锁的

热点排行