永发信息网

c#多线程同步输出

答案:3  悬赏:20  手机版
解决时间 2021-04-30 16:30
最近刚刚学C#看了些书但是很多地方就是不明白 自己想做个多线程访问一个东西
也就是几个线程同时完成一件事情 我下面那个例子是6个线程 输出30
想要的结果是
0:0
2:1
3:2
4:3
5:4
1:5以此类推

总之就是不管是哪个线程输出都行 但是一定要是多个线程去执行这个输出任务
另外那个异常那个地方的捕获 次次都捕获到 好像是 线程正在终止 一下记不清了!!
  麻烦大家 帮我改改代码 查查那个原因是怎么回事
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication6
{
    class Program
    {
        Mutex m = new Mutex();
        List<Thread> t = new List<Thread>();//保存线程
        static void Main(string[] args)
        {
            Program p = new Program();
            p.statr();
            Console.ReadLine();
        }
        public Program()
        {
            for (int i = 0; i < 6; i++)//初始化建立2个线程
            {
                Thread therad = new Thread(run);
                therad.Name = i.ToString();
                t.Add(therad);
            }
        }
        public void statr()
        {
            foreach (Thread tt in t)
            {
                tt.Start();//所有线程开始执行
            }
        }
        public void run(object h)//这个h没啥用 关键是用来lock里面要个东西人家就告诉我这样写就可以了
        {
            try
            {
                lock (this)
                {
                    for (int i = 0; i < 30; i++)
                    {
                        Console.WriteLine("{0}:{1}", Thread.CurrentThread.Name, i);
                    }
                }
                stop();//上面输出完毕  调用停止线程方法
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
        }
        public void stop()
        {
            Console.WriteLine("test ok");
            foreach (Thread tt in t)
            {
                tt.Abort();//所有线程停止
            }
        }
    }
}
最佳答案
用一个Monitor锁定就OK了,下面是完整代码,你可以直接复制过去运行的class Program    正在运行", Thread.CurrentThread.Name, count);                if (count == 50)                                count += 1;                Monitor.Exit(this);//取消锁定                Thread.Sleep(5);            }        }        public Program()        ", i);                ThreadCollection.Add(mythread);            }            OnNumberClear += new EventHandler(Program_OnNumberClear);        }        void Program_OnNumberClear(object sender, EventArgs e)                }        public void Action()                }        static void Main(string[] args)            }
全部回答

加一个lock就可以了

private static object _syncOutObject= new object();

public static void Out(string message)

{

    lock(_syncOutObject)

    {

    Console.WriteLine(message);

    }

}

然后所有需要输出的地方就调用它就可以了,

这只是一个参考,具体这个方法有哪些参数,里面怎么实现,你自己可以去完成,

我这里只是演示lock的用法

你6个线程都虽然并行执行run(),但是lock(this)的时候里面的循环输出变成同步顺序执行了

所以输出会是1:0,1:1,1:2,...1:29,3:0,3:1,3:2,...3:29,2:0,2:1,...,这样的

如果你想打乱输出结果就不要在这里使用lock。

至于你说的"另外那个异常那个地方的捕获 次次都捕获到",是因为某个线程首先执行完输出就调用了stop(),stop的时候把所有线程都调用Abort()申请退出,但是其他有的线程还在执行stop(),结果就有“线程正在终止”之类的异常

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
小泰迪一般多大可以带出去溜
谁能给我起个名字火线的
吃香蕉片容易发胖吗?
如果用了QQ空间QCC皮肤还可以换背景音乐吗,
万研科技电脑客户服务中心地址在什么地方,想
我有药材壁虎
我真的为难了
如何使用携程消费券,携程贵宾卡应该怎么用啊
QQ企鹅赛孔明游戏
国产智能手机推荐下吧!
我是现役军人,当兵后夫母搬到外地了,家人户
邮政网汇e的手续费
描写老人着急时的动作,神态的好段
圪垯泉村怎么去啊,有知道地址的么
求《月上重火》全文、
推荐资讯
网上真的能交到好朋友吗?
还有没有管
做泰拉任务最快多久能做完。大概要多少钱才能
请问这2个名字用韩语怎么翻译啊!?
从河西区小围堤道打车到靖江桥多少钱
形容河水的诗句
动感新势力问题。
重庆老三涮羊肉自助火锅怎么去啊,有知道地址
迷迭香 的含义、
kk营养运动会所怎么去啊,有知道地址的么
电脑高手请帮下忙啊!
现在N73还能称得上街机王吗?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?