急寻高手,帮帮忙吧,这个该怎么写:C#for循环生成线程顺序对一个函数执行操作。

cola_zhangjh 2012-11-01 10:07:55
C#用for循环生成线程,生成的线程对函数A执行操作。等执行完函数A之后,终止该线程,然后继续for循环,再生成一个线程,再对函数A进行操作,等执行完函数A之后,终止该线程,。。。。继续执行for循环,直至for 循环结束,函数A不能加静态属性。线程必须生成、终止,再生成、在终止。这个该怎么写呢?求教高手急寻高手,这个程序我写了好几天了,也没有写出来。哪位高手会,帮下小弟,最好给个例子
...全文
242 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cola_zhangjh 2012-11-02
  • 打赏
  • 举报
回复
三楼的代码再加个锁。以保证资源的独占
private void Foo(Object o)
{
lock(this)
{
this.Text = "Thread " + o.ToString();
Thread.Sleep(3000);
}
}
cola_zhangjh 2012-11-02
  • 打赏
  • 举报
回复
我做的这个实际上是一个通过tcp传输数据的函数,因为这个函数要独占一些东西,需要加锁,所以必须等一个文件传完,释放锁之后才能传下一个文件。
XBodhi. 2012-11-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
C#用for循环生成线程,生成的线程对函数A执行操作。等执行完函数A之后,终止该线程,然后继续for循环,再生成一个线程,再对函数A进行操作,等执行完函数A之后,终止该线程,。。。。继续执行for循环,直至for 循环结束,函数A不能加静态属性。线程必须生成、终止,再生成、在终止。这个该怎么写呢?求教高手急寻高手,这个程序我写了好几天了,也没有写出来。哪位高手会,帮下小弟,最好给个例子
[/Quote]


对楼主极度无语。

 for (int i = 0; i < 10; i++)
{
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(SendMessage));
thread.Start();
}


public void SendMessage()
{

}

cheng2005 2012-11-02
  • 打赏
  • 举报
回复
好傻的做法,还循环开线程,看不出来有什么意义。
还不如开一个发送线程,把要发送的东西往队列里面一扔就完事了。优雅100倍
niss 2012-11-02
  • 打赏
  • 举报
回复
没加队列,只简单写了一个大概
niss 2012-11-02
  • 打赏
  • 举报
回复
class Program
{
static EventWaitHandle _workEvent = new ManualResetEvent(false);
public static void Main()
{
myThread t = new myThread();

while (true)
{
string s = Console.ReadLine();
t.Run(s);
}
}
}

class myThread
{
Thread _thread;
object _state;
EventWaitHandle _workEvent;

public myThread()
{
_workEvent = new ManualResetEvent(false);

_thread = new Thread(new ThreadStart(invoke));
_thread.IsBackground = true;
_thread.Start();
}

void invoke()
{
while (_workEvent.WaitOne())
{
A();
_workEvent.Reset();
}
}

public bool IsBusy
{
get
{
return _workEvent.WaitOne(0);
}
}

public void Run(object state)
{
if (!IsBusy)
{
_state = state;
_workEvent.Set();
}
}

public void A()
{
Console.WriteLine(string.Format("接收到输入信息:{0}", _state));
}
}
SocketUpEx 2012-11-01
  • 打赏
  • 举报
回复
        public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}

private void button1_Click(object sender, EventArgs e)
{
for (Int32 i = 0; i < 1000; i++)
{
Thread t = new Thread(new ParameterizedThreadStart(Foo));
t.IsBackground = true;
t.Start(i);
t.Join();
}
}

private void Foo(Object o)
{
this.Text = "Thread " + o.ToString();
Thread.Sleep(3000);
}


hhddzz 2012-11-01
  • 打赏
  • 举报
回复
for(int i=0;i<5;i++)
{
var t=new Thread(A);
t.Start();
t.Join();
}

不知道你这样做有什么特殊的意义
当你在网络上抓到一些数据包,想知道这些包是哪个进程发出来的时候, 怎么办?这个小工具也许能帮一些忙。 这个工具采用的是HOOK进程的winsock API,把一些数据记录下来。 HOOK API在《windows核心编程》提到的有两种, 1.1 修改IAT。缺点:象shellcode中常用的那种根据DLL输出表来计算函数 地址的方法,修改IAT就无法HOOK到目标函数了。 1.2 修改目标函数的前几字节,跳转到我们的函数,我们的函数里面再把那 几个字节还原,调用原函数。重复。缺点:多线程环境下这种方法并不 健壮。 29A杂志里面的文章《挂钩Windows API》也提到了几种办法: (中译文见http://www.xfocus.net/articles/200403/681.html) 2.1 patch静态文件,即运行前挂钩. 2.2 也是修改IAT,跟1.1一样. 2.3 修改目标函数的前几个字节,跳转到新的函数,但不再调用原始函数,无 实际意义,作者只是做演示? 2.4 这种方法(3.2.3 保存原始函数)很COOL,其中的亮点和难点就是“获取任意 地址的指令长度”。 之前我也想用2.4这种办法,但卡在如何“获取任意地址的指令长度”上面了:( 在看到《挂钩Windows API》这篇文章之前,我取了一个比较简单有效的办法: 3.1 把目标函数的DLL COPY一份到内存中,修改原目标函数的前几字节,跳转 到我们的函数,在我们的函数中调用原函数新的COPY。

111,125

社区成员

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

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

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