C#怎么开辟多线程,要是多了是不是会出错,出错了怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#怎么开辟多线程,要是多了是不是会出错,出错了怎么办?相关的知识,希望对你有一定的参考价值。

首先开辟线程需要使用命名空间System.Threading。
//应用程序主入口
[STAThread]
static void Main(string[] args)

//先要创建线程
Thread threadOne = new Thread(new ThreadStart(MethodOne));
//同理创建threadTwo、threadThree多个线程
//启动线程
threadOne.Start();
//主线程的具体执行代码
......

//threadOne的执行代码
public static void MethodOne()

......

//同理可有多个线程的执行代码

开辟多线程的方法如上。

而至于多线程可能产生的错误,最有可能的原因是多线程对公共资源的同时访问导致的错误。为了解决这个问题,可以使用加锁、监视器、互斥体等方法,可避免多线程对公共资源同时访问产生的问题。
加锁:
lock(expression(加锁对象))statement block(正在访问共享资源的程序段)
如此可保证多线程对公共资源实行互斥访问。
监视器和互斥体的功能类似,使用方法略复杂一些,可以在CSDN上找详细的用法。基本的互斥操作使用lock就足够了。
希望对你有用。
参考技术A System.Threading.Thread HangUpthread = new Thread(new ParameterizedThreadStart(OnHangUp));
HangUpthread.Start();
//线程OnHangUp
public void OnHangUp()



程序退出的时候一定要退出所有线程,要不会出错或者当前程序的进程还在!线程里所有的数据刷新界面的时候会出现错误,必须用委托的方式才能把这个数据刷新界面!
参考技术B 怎么运行线程的话,这不是一两句话就能说清楚的,我就不多说了,MSDN中很多例子。
至于线程多了就容易出错的问题,就看你怎么控制了,如果控制得好的话,在硬件能够承受的范围内,可以创建无数个线程。

建议你在网上搜些教程,然后自己多写几段程序,在写的过程中会碰到一些问题,然后再针对具体的问题自己去找答案,这样才会记得 写多了自然就熟了 呵呵
参考技术C Thread thread = new Thread();
//开辟个线程
如果是同一个方法 在没返回前是有可能资源冲突的

锁定方法资源 解决冲突问题本回答被提问者采纳
参考技术D using System;
using System.Threading;

public class Test

static void Main()

ThreadStart job = new ThreadStart(ThreadJob);
Thread thread = new Thread(job);
thread.Start();

for (int i=0; i < 5; i++)

Console.WriteLine ("Main thread: 0", i);
Thread.Sleep(1000);



static void ThreadJob()

for (int i=0; i < 10; i++)

Console.WriteLine ("Other thread: 0", i);
Thread.Sleep(500);


尝试在多线程中处理链接时出错

【中文标题】尝试在多线程中处理链接时出错【英文标题】:Getting error when trying to process links in multithread 【发布时间】:2016-02-01 00:10:03 【问题描述】:

当我尝试通过 python3.4 中的 asyncio 和 concurrent.futures 模块处理具有 20 个线程的 100k url 时,出现此错误。它会在脚本运行 2-5 分钟后出现。

concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending.
Task exception was never retrieved
future: <Task finished coro=<main() done, defined at async.py:173> exception=BrokenProcessPool('A process in the process pool was terminated abruptly while the future was running or pending.',)>

我正在尝试优化我的代码,但仍然出现此错误,如前所述。

代码:

import asyncio
import time
from concurrent.futures import ProcessPoolExecutor
from grab import Grab
import random
import psycopg2

# Open connection to the database
connection = psycopg2.connect(database="<....>",
                              user="<....>",
                              password="<....>",
                              host="127.0.0.1",
                              port="5432")

# Create a new cursor for it
c = connection.cursor()

# Select settings from database
c.execute("SELECT * FROM <....> WHERE id=1;")
data = c.fetchall()

# Get time starting script
start_time = time.time()

def operation(link):
    # init grab framework
    g = Grab()
    # try to find some elements on the page
    try:
        # open link
        g.go(link)
        # some link processing
        <....>
    except:
        pass


@asyncio.coroutine
def main(item):
    yield from loop.run_in_executor(p, operation, item)

# Create async loop, declare number of threads
loop = asyncio.get_event_loop()
p = ProcessPoolExecutor(data[0][13])  # =20

# Init tasks list - empty
tasks = []

# Select all urls which need to process
c.execute ("SELECT url FROM <....> ORDER BY id;")

# Forming tasks
for item in c.fetchall():
    tasks.append(main(item[0]))

# Close main connection to the database
connection.close()
# Run async tasks
loop.run_until_complete(asyncio.wait(tasks))
# Close loop
loop.close()
# Get script finish time
print("--- %s seconds ---" % (time.time() - start_time))

【问题讨论】:

【参考方案1】:

loop.close() 之后添加p.shutdown() 等待完成所有已执行的任务。

【讨论】:

仍然遇到同样的错误。回溯到这一行:yield from loop.run_in_executor(p, operation, item) 现在怎么了? 啊啊。您在operation() 调用中遇到未处理的异常。

以上是关于C#怎么开辟多线程,要是多了是不是会出错,出错了怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

C#多线程如何处理数据

PYQT5怎么更新UI显示的内容

多线程并发会造成程序周期性崩溃吗?

C#多线程实现循环。界面会假死怎么办?

当我在 c# sql 的 listview 中插入多个产品时出错。怎么了?

delphi idhttp在ADSL断网重连后会出错,是怎么回事?