线程同步 能实现不?

程序小海 2011-04-04 11:18:04
我想实现的是:

在线程一中:
不断的从数据库中读取数据信息匹配
当匹配出 达到我们监控的要求后 我会把这条信息 存储在 全局的 datatable中

在线程二中:
我会对datatable中的数据一条条的删除

数据匹配存储这个过程是一直进行的 不能受打扰,即使在datatable被线程二使用着,也要马上让给
线程一去操作。

不知道能否实现这样的效果不??

想过用lock,lock(datatable),这样实现我的功能,不知这样是否正确??
...全文
119 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ming_mu 2011-04-06
  • 打赏
  • 举报
回复
应该可以
程序小海 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ming_mu 的回复:]

用事件
C# code



public class Insert
{

public void SpinUp()
{
ThreadStart start = new ThreadStart(this.Start);
Thread _thread = new Thread(star……
[/Quote]

你好,我想问 lock 可以替换你写的那段代码吗?? 替换了,能达到你那效果不??
ming_mu 2011-04-04
  • 打赏
  • 举报
回复
用事件



public class Insert
{

public void SpinUp()
{
ThreadStart start = new ThreadStart(this.Start);
Thread _thread = new Thread(start);

_thread.Start();
}
private void Start()
{

for (int i = 1; i <= 5; i++)
{
Thread.Sleep(1000);//实现延迟启动

Delete.sem.Reset();//强行暂停Delete把控制句柄交给Insert

Console.WriteLine("新增第 " + i.ToString() + " 行");
Manage.d.Rows.Add(new object[] { i, i.ToString() });

Delete.sem.Set();// 释放Delete
}
Delete.fi = 1;
}
}






public class Delete
{

public static ManualResetEvent sem = new ManualResetEvent(false);
public static int fi = 0;
public void SpinUp()
{
ThreadStart start = new ThreadStart(this.Start);
Thread _thread = new Thread(start);
_thread.Name = "Delete";
_thread.Start();
}
private void Start()
{
do
{
sem.WaitOne();

for (int i = Manage.d.Rows.Count-1; i >= 0; i--)
{
Console.WriteLine("删除第 " + Manage.d.Rows[i][0] + " 行");
Manage.d.Rows[i].Delete();
}

} while (fi == 0);
Console.WriteLine("所剩行数: " + Manage.d.Rows.Count.ToString());
Console.ReadLine();
}
}




class Manage
{
public static DataTable d = new DataTable();
public Manage()
{
DataColumn dc1 = new DataColumn("ID");
DataColumn dc2 = new DataColumn("value");
d.Columns.AddRange(new DataColumn[] { dc1, dc2 });
}
public void start()
{
Insert i = new Insert();
i.SpinUp();
Delete de = new Delete();
de.SpinUp();
}
}
  • 打赏
  • 举报
回复
按LZ说的好像有点矛盾,同一时刻,根本不可能让两个线程同时作业的
线程一访问的时候必须得锁住了
线程二只有在收到某个通知(线程一现在休息了,控制句柄现在可以交给你了)后才能开始作业
作业过程中如果收到另一个通知(线程一现在上班了,必须移交控制权)

而上述过程正好是信号量完全胜任的工作
founderfang 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 stone1314 的回复:]
引用 2 楼 ming_mu 的回复:

用信号量

用信号量的话 当我对datatable操作的时候, 不是就不能让线程一去添加数据了吗?
[/Quote]

用锁也是一样的,无论是用信号量还是锁都只要在操作datatable的时候用,换句话说就是尽量减少信号量或锁的控制范围。
程序小海 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ming_mu 的回复:]

用信号量
[/Quote]
用信号量的话 当我对datatable操作的时候, 不是就不能让线程一去添加数据了吗?
ming_mu 2011-04-04
  • 打赏
  • 举报
回复
用信号量
快溜 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 stone1314 的回复:]
我想实现的是:

在线程一中:
不断的从数据库中读取数据信息匹配
当匹配出 达到我们监控的要求后 我会把这条信息 存储在 全局的 datatable中

在线程二中:
我会对datatable中的数据一条条的删除

数据匹配存储这个过程是一直进行的 不能受打扰,即使在datatable被线程二使用着,也要马上让给
线程一去操作。

不知道能否实现这样的……
[/Quote]可以,试试吧,控制好锁。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧