问题描述:有多个模块,通过网络链接,本人想通过一台计算机同时对这些模块发送数据和接收数据,然后把接收到的数据写入数据库或者文件。
意思就是:通过本地计算机,建立多个Socket到模块的连接,然后发送数据及接收数据。因为要把接收的数据写入数据库或者文件,所以。。要让这些线程分开访问数据库或者文件。
我加了Lock()后,线程是分别访问公共模块的;但如果我要在这个模块中加入一个函数调用(用来对接收的数据进行分析的)后,则会引起线程之间的访问混乱。。不知道怎么解决,忘高人指点一二
意思就是:通过本地计算机,建立多个Socket到模块的连接,然后发送数据及接收数据。因为要把接收的数据写入数据库或者文件,所以。。要让这些线程分开访问数据库或者文件。
我加了Lock()后,线程是分别访问公共模块的;但如果我要在这个模块中加入一个函数调用(用来对接收的数据进行分析的)后,则会引起线程之间的访问混乱。。不知道怎么解决,忘高人指点一二
解决方案 »
- 我想用timer1监控webBrowser1.Url 怎么不起作用呢?
- C# dll 定义及参数传递
- 正则表达式 屏蔽0值
- bool值的用法
- Winform如何打开模式窗体
- c# 在获取连接字符串时出现这样的错误“MainForm.Properties.Settings.WorkerManageConnectionStr不可访问。
- 问一个同时接收两个串口数据的问题
- 我的.net2005中的工具怎么也打不开?
- C#里最大化事件怎么添加?
- 请问各位高手,能否给我发关于套打的代码.
- 请教一个如何实现两张图片之间的效果切换。(如左右拉伸)
- WINFORM自定义控件中绘制图形,如何让控件自动根据绘制图形出现滚动条?
也就是说第一个线程还没有结束对公共区的访问,其他线程就进去了。。
可是我在第一个线程进去的时候锁了公共区的呀,,用LOCK(THIS)锁了撒为什么其他的线程还是可以进去??
试过用Monitor.Enter(this) Monitor.Exit(this)
都没解决,,不知道怎么搞、、
fuc aaa()
{
lock(this)
{
ab=ac/ab;
}
}Monitor:这样写的
try
{
Monitor.Enter(this)
ab=ac/ab;
}
finally
{
Monitor.Exit(this)
}
MSN:[email protected]
Email:[email protected]
lock(syncobj)
{
}
没代码,说的太模糊。
lock(syncobj)
{
}
没代码,说的太模糊。
========================================================
function aaa()
{
在这里写??
private static object syncobj = new object();
lock(syncobj)
{
}
}
for (int i = 0; i < 3; i++)
{
thr[i] = new Thread(new ThreadStart(GetListen));
thr[i].Name = i.ToString();
//str = sr.ReadLine();
}
for (int i = 0; i < 3; i++)
{
thr[i].Start();
Thread.Sleep(5000);
}
for (int i = 0; i < 3; i++)
{
thr[i].Abort();
}
private void GetListen()
{
lock (this)
{
string ipaddress = "192.168.0.101";
string port = "10000";
IPAddress ipa = IPAddress.Parse(ipaddress);
IPEndPoint iep = new IPEndPoint(ipa, Convert.ToInt32(port));
mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] bytes = new byte[4096];
mysocket.Connect(iep);
try
{
byte[] sendbyte = new byte[1024]; sendbyte[0] = 0x32;
sendbyte[1] = 0x33;
sendbyte[2] = 0x03;
sendbyte[3] = 0x0B;
sendbyte[4] = 0x01;
mysocket.Send(sendbyte, 5, SocketFlags.None);
Thread.Sleep(1000);
mysocket.Receive(bytes);
string msg = Encoding.Default.GetString(bytes);
this.ListBox1.Items.Add(msg);
}
catch (SocketException ex)
{
string aa = ex.Message.ToString();
}
mysocket.Shutdown(SocketShutdown.Both);
mysocket.Close();
}
}
比如:
class myclass
{
public void fun()
{
lock(this)
{
...
}
}
}下面锁定就是可以接受的
myclass x = new myclass();
for (int i = 0; i < 10; i++)
{
Thread t = new Thread(new ThreadStart(x.fun));
t.Start();
}
下面的就是错误的
myclass x = new myclass();
myclass x2 = new myclass();
Thread t = new Thread(new ThreadStart(x.fun));
Thread t2 = new Thread(new ThreadStart(x2.fun));
t.Start();
t2.Start();虽然都是同一个类产生的,但是不是同一个对象,所以无法锁定.
请注意你的线程对象实例是不是同一个(也就是公共资源),如果不是,那么把他定义成静态的或者单例模式
for (int i = 0; i < 3; i++)
{
thr[i].Abort();
}
你中断线程干吗呢?线程工作完成后自然会自动释放.
取消这段代码,根源啊