C#多线程问题

我在文本框中输入信息,我点击按钮的时候,用多线程循环输出,且每次循环在后面显示+1,+2.......,

解决方案一


  使用 Thread 类 来实现

//资料来源 https://msdn.microsoft.com/zh-cn/library/xx3ezzs2(v=vs.110).aspx
using System;
using System.Threading;

class Test
{
    static void Main() 
    {
        Thread newThread = 
            new Thread(new ThreadStart(Work.DoWork));
        newThread.Start();
    }
}

class Work 
{
    Work() {}

    public static void DoWork() {}
}


  由于你是对控件进行线程操控这里使用委托来解决

//资料来源 https://msdn.microsoft.com/zh-cn/library/system.threading.threadstart(v=vs.110).aspx
using System;
using System.Threading;

class Test
{
    static void Main() 
    {
        // To start a thread using a static thread procedure, use the
        // class name and method name when you create the ThreadStart
        // delegate. Beginning in version 2.0 of the .NET Framework,
        // it is not necessary to create a delegate explicitly. 
        // Specify the name of the method in the Thread constructor, 
        // and the compiler selects the correct delegate. For example:
        //
        // Thread newThread = new Thread(Work.DoWork);
        //
        ThreadStart threadDelegate = new ThreadStart(Work.DoWork);
        Thread newThread = new Thread(threadDelegate);
        newThread.Start();

        // To start a thread using an instance method for the thread 
        // procedure, use the instance variable and method name when 
        // you create the ThreadStart delegate. Beginning in version
        // 2.0 of the .NET Framework, the explicit delegate is not
        // required.
        //
        Work w = new Work();
        w.Data = 42;
        threadDelegate = new ThreadStart(w.DoMoreWork);
        newThread = new Thread(threadDelegate);
        newThread.Start();
    }
}

class Work 
{
    public static void DoWork() 
    {
        Console.WriteLine("Static thread procedure."); 
    }
    public int Data;
    public void DoMoreWork() 
    {
        Console.WriteLine("Instance thread procedure. Data={0}", Data); 
    }
}

/* This code example produces the following output (the order 
   of the lines might vary):
Static thread procedure.
Instance thread procedure. Data=42
 */


解决方案二


  使用 BackgroundWorker 类 来实现

//资料来源 https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(v=vs.110).aspx
using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace BackgroundWorkerSimple
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }

        private void startAsyncButton_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                // Start the asynchronous operation.
                backgroundWorker1.RunWorkerAsync();
            }
        }

        private void cancelAsyncButton_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                // Cancel the asynchronous operation.
                backgroundWorker1.CancelAsync();
            }
        }

        // This event handler is where the time-consuming work is done.
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; i <= 10; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    // Perform a time consuming operation and report progress.
                    System.Threading.Thread.Sleep(500);
                    worker.ReportProgress(i * 10);
                }
            }
        }

        // This event handler updates the progress.
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
        }

        // This event handler deals with the results of the background operation.
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                resultLabel.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                resultLabel.Text = "Error: " + e.Error.Message;
            }
            else
            {
                resultLabel.Text = "Done!";
            }
        }
    }
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-10-10
实现应该不难,但你描述的有点不知道你要干嘛追问

就是把输出的信息显示到LED上,在LED上循环文字而已

C#中的多线程问题用于什么地方?怎么掌握?
1.每个窗体都有自己的都在不同的线程上运行,如果需要在窗体之间交互,就需要在线程之间交互。2.当线程Sleep时,系统就退出执行队列一段时间,当睡眠结束时,系统会产生一个时钟中断,从而 使线程回到执行队列中,从而恢复线程的执行。3.如果父线程先于子线程结束,那么子线程将在父线程结束的同时被迫结...

多线程保存文件报错c#
请问你是想问“多线程保存文件报错c#是怎么回事”吗?该问题的原因有:文件访问冲突、文件访问冲突。1、文件访问冲突:当多个线程试图同时写入同一个文件时,会出现竞争条件。如果两个线程试图在同一时间写入文件的相同部分,会导致数据损坏或者写入的数据不完整。为了解决这个问题,可以使用文件锁(FileLock...

C#网络编程与多线程的疑问,求指点
private void btnStart_Click(object sender, EventArgs e) { bg.RunWorkerAsync(); } \/\/线程暂停,如果不需要暂停就不用,这里只是说明用法 private void btnStop_Click(object sender, EventArgs e) { bg.CancelAsync(); } \/\/窗体关闭时,停止线程 protected override...

C#语言,处理多线程时,让线程运行死循环,却有线程在处理数据时,意外退 ...
你的代码肯定有数据的错误,比如int型超过21亿溢出,非数字型字符串强制转换数字型,等等任何数据的错误都会导致线程退出,你把死循环整个try{}catch{}起来,就不会退出了

c# 多线程的小问题
多线程可以有效的并发。对于包含不同任务的程序,可以考虑每个任务使用一个线程。这样的程序在设计上相对于单线程做所有事的程序来说,更为清晰明了,比如生产、消费者问题。在实际的开发中对于性能优化的问题需要考虑到具体的场景来考虑是否使用多线程技术。也就是说线程和效率不是成正比对应的 ...

初学C#,现有 多线程处理数据问题: 有1000条记录,每条记录都要这样处理...
额,对于你的问题我只能这么说,使用多线程不但不会提升处理速度,而且会降低数据处理速度!记住,是一定会降低处理速度!你要明白多线程的作用是异步处理,而不是提高速度(哪怕你的cpu是一万核的也白搭,那只能说明你电脑的处理性能很高),因为所谓多线程其实是“伪线程”,创建越多的线程,则会越多...

C#多线程问题
一、局域网模式 1、服务器启动监听端口;2、客户端向服务发出连接请求,同时创建一个随机监听端口,并进行监听;3、服务器接收到连接请求后创建一个连接,进行基本消息验证,验证通过,读取消息协议中客户端的IP和随机端口,向客户端发出连接请求,同时释放服务器端监听创建的连接,以便处理下一个监听;4、...

C#中的多线程超时处理实践
最近处理C#中timeout行为的bug,解决方案涉及多线程超时处理。首先,创建了一个类来处理超时操作。定义了`OperationHandler`类,包含`IOperation`接口实例和`StartWithTimeout`方法,用于在超时后执行操作,以及`StopOperationIfNotStartedYet`方法,用于在超时期间停止操作。接着,实现了一个操作类`MyOperation...

C#怎么开辟多线程,要是多了是否会出错,出错了怎么办?
开辟多线程的方法如上。而至于多线程可能产生的错误,最有可能的原因是多线程对公共资源的同时访问导致的错误。为了解决这个问题,可以使用加锁、监视器、互斥体等方法,可避免多线程对公共资源同时访问产生的问题。加锁:lock(expression(加锁对象)){statement block(正在访问共享资源的程序段)} 如此可...

C#多线程编程实例
它首先进入临界区(用以在多线程环境下保证活动线程数目的操作的正确性)判断当前活动线程的数目 如果有写线程(m_nActive< )存在 则等待指定的时间并且等待的阅读线程数目加 如果当前活动线程是读线程(m_nActive>= ) 则可以让读线程继续运行 申请写入锁的函数原型为 public void AcquireWriterLock( int ...

相似回答