lol饮魔被动会不会变大:C# 多线程控制问题(检测字符串数组里的字符串)

来源:百度文库 编辑:高考问答 时间:2024/07/05 23:22:58
winForm程序
问题①:有下面一段代码,功能是启动多线程检测tmpArray[]数组里面的每个字符串,我想把线程总数控在10个以内,如果tmpArray[]数组里面的字符串超过10个,我怎么控制这个循环先取tmpArray[]数组里的10个字符串进行检测,等有检测完关闭的线程时(也就是当前线程总数小于10个时)再继续取其他的字符串检测直到检测完tmpArray[]数组里面的所有字符串.

问题②:(接上面)每次检测就和一个已经定义好的字符串进行比较,要是相同就终止这个线程,每个字符串最多检测3次,超过3次就终止检测并返回一个检测失败的标志false

foreach (string tmpStr in tmpArray)//tmpArray 是一个字符串数组
{
C_Thread C_th = new C_Thread(tmpStr);
//C_Thread 是一个定义好的类,是来给T_start函数传递参数用的
Thread th = new Thread(new ThreadStart(C_th.T_start));
th.Start();
}
上面的问题可能说的不太清楚,好长时间了都没有对题的回答,解决下面的问题也可以,谢谢

c# 像蚂蚁、迅雷、网际快车那样的多线程控制问题
程序中有一个Listview控件,工作时有多个线程,我想每开一个工作线程的时候,在Listview控件中来显示这个线程的状态和进度,就像蚂蚁、迅雷、网际快车那样。并且对Listview中某项删除、暂停、停止的操作后,相应的线程也被删除、暂停、停止。问题主要是如何来管理这些线程,怎样使Listview中的每一项与相应的线程建立通信。

c# 像蚂蚁、迅雷、网际快车那样的多线程控制问题

用hash表+arraylist可以实现。先用arraylist对象存储每个线程的状态,再用hashtable存储每个线程的id和对应的状态(arraylist),需要的地方取出来就可以了,,

加我QQ给你解答分数我全要了 保证非常详细 还可以给你做个例子 分数都是我的了嘎嘎

在创建操作系统进程时,操作系统将插入一个线程以执行该进程(包括任何原始应用程序域)中的代码。从此刻起,就可以创建和销毁应用程序域,而不必创建或销毁任何操作系统线程。如果正在执行的代码是托管代码,则可以通过在线程类 Thread.CurrentThread 上检索静态属性来获取正在当前应用程序域中执行的线程的 Thread 对象。
创建 Thread 对象的新实例时,将创建新的托管线程。Thread 的构造函数采用 ThreadStart 委托作为其唯一参数,该委托用于包装在调用 Thread.Start 时由新的 Thread 调用的方法。多次调用 Thread.Start 将引发 ThreadStateException。
Thread.Start 向系统提交异步请求,并且该调用可能在新的线程实际启动之前立即返回。可以使用 Thread.ThreadState 和 Thread.IsAlive 在任一时刻确定线程的状态。Thread.Abort 中止线程,并对其进行标记以进行垃圾回收。下面的代码示例创建两个新线程以调用另一个对象上的实例和静态方法。
[Visual Basic]
Imports System
Imports System.Threading

Public Class ServerClass

' The method that will be called when the thread is started.
Public Sub InstanceMethod()
Console.WriteLine("ServerClass.InstanceMethod is running on another thread.")
Thread.Sleep(3000) ' Pause for a moment to provide a delay to make threads more apparent.
Console.WriteLine("The instance method called by the worker thread has ended.")
End Sub 'InstanceMethod

Public Shared Sub StaticMethod()
Console.WriteLine("ServerClass.StaticMethod is running on another thread.")
Thread.Sleep(5000) ' Pause for a moment to provide a delay to make threads more apparent.
Console.WriteLine("The static method called by the worker thread has ended.")
End Sub 'StaticMethod
End Class 'ServerClass

Public Class Simple

Public Shared Sub Main()
Console.WriteLine("Thread Simple Sample")

Dim serverObject As New ServerClass()

' Create the thread object, passing in the
' serverObject.InstanceMethod method using a
' ThreadStart delegate.
Dim InstanceCaller As New Thread(New ThreadStart(AddressOf serverObject.InstanceMethod))

' Start the thread.
InstanceCaller.Start()

Console.WriteLine("The Main() thread calls this after starting the new InstanceCaller thread.")

' Create the thread object, passing in the serverObject.StaticMethod
' method using a ThreadStart delegate.
Dim StaticCaller As New Thread(New ThreadStart(AddressOf ServerClass.StaticMethod))

' Start the thread.
StaticCaller.Start()

Console.WriteLine("The Main() thread calls this after starting the new StaticCaller threads.")

End Sub 'Main
End Class 'Simple
[C#]
using System;
using System.Threading;

public class ServerClass{
// The method that will be called when the thread is started.
public void InstanceMethod(){
Console.WriteLine("ServerClass.InstanceMethod is running on another thread.");
// Pause for a moment to provide a delay to make threads more apparent.
Thread.Sleep(3000);
Console.WriteLine("The instance method called by the worker thread has ended.");
}

public static void StaticMethod(){
Console.WriteLine("ServerClass.StaticMethod is running on another thread.");
// Pause for a moment to provide a delay to make threads more apparent.
Thread.Sleep(5000);
Console.WriteLine("The static method called by the worker thread has ended.");
}
}

public class Simple{
public static int Main(String[] args){
Console.WriteLine("Thread Simple Sample");

ServerClass serverObject = new ServerClass();

// Create the thread object, passing in the
// serverObject.InstanceMethod method using a ThreadStart delegate.
Thread InstanceCaller = new Thread(new ThreadStart(serverObject.InstanceMethod));

// Start the thread.
InstanceCaller.Start();

Console.WriteLine("The Main() thread calls this after starting the new InstanceCaller thread.");

// Create the thread object, passing in the
// serverObject.StaticMethod method using a ThreadStart delegate.
Thread StaticCaller = new Thread(new ThreadStart(ServerClass.StaticMethod));

// Start the thread.
StaticCaller.Start();

Console.WriteLine("The Main() thread calls this after starting the new StaticCaller threads.");

return 0;
}
}
向线程传递数据
ThreadStart 委托既没有参数也没有返回值。这意味着不可以使用需要参数的方法启动线程,或从方法中获得返回值。
为向线程传递数据,需要创建一个用来保持数据和线程方法的对象,如下面的两个代码示例所示。
为检索线程方法的结果,您可以使用回调方法,如第二个代码示例中所示。
[Visual Basic]
Imports System
Imports System.Threading

' The ThreadWithState class contains the information needed for
' a task, and the method that executes the task.
'
Public Class ThreadWithState
' State information used in the task.
Private boilerplate As String
Private value As Integer

' The constructor obtains the state information.
Public Sub New(ByVal text As String, ByVal number As Integer)
boilerplate = text
value = number
End Sub

' The thread procedure performs the task, such as formatting
' and printing a document.
Public Sub ThreadProc()
Console.WriteLine(boilerplate, value)
End Sub
End Class

' Entry point for the example.
'
Public Class Example
Public Shared Sub Main()
' Supply the state information required by the task.
Dim tws As New ThreadWithState("This report displays the number {0}.", 42)
' Create a thread to execute the task, and then
' start the thread.
Dim t As New Thread(AddressOf tws.ThreadProc)
t.Start()
Console.WriteLine("Main thread does some work, then waits.")
t.Join()
Console.WriteLine("Independent task has completed; main thread ends.")
End Sub
End Class
[C#]
using System;
using System.Threading;

// The ThreadWithState class contains the information needed for
// a task, and the method that executes the task.
//
public class ThreadWithState {
// State information used in the task.
private string boilerplate;
private int value;

// The constructor obtains the state information.
public ThreadWithState(string text, int number) {
boilerplate = text;
value = number;
}

// The thread procedure performs the task, such as formatting
// and printing a document.
public void ThreadProc() {
Console.WriteLine(boilerplate, value);
}
}

// Entry point for the example.
//
public class Example {
public static void Main() {
// Supply the state information required by the task.
ThreadWithState tws =
new ThreadWithState("This report displays the number {0}.", 42);
// Create a thread to execute the task, and then
// start the thread.
Thread t = new Thread(new ThreadStart(tws.ThreadProc));
t.Start();
Console.WriteLine("Main thread does some work, then waits.");
t.Join();
Console.WriteLine("Independent task has completed; main thread ends.");
}
}
用回调方法检索数据
下面的示例演示了一个从线程中检索数据的回调方法。包含数据和线程方法的类的构造函数也接受代表回调方法的委托;在线程方法结束前,它调用该回调委托。
[Visual Basic]
Imports System
Imports System.Threading

' The ThreadWithState class contains the information needed for
' a task, the method that executes the task, and a delegate
' to call when the task is complete.
'
Public Class ThreadWithState
' State information used in the task.
Private boilerplate As String
Private value As Integer
' Delegate used to execute the callback method when the
' task is complete.
Private callback As ExampleCallback

' The constructor obtains the state information and the
' callback delegate.
Public Sub New(ByVal text As String, ByVal number As Integer, _
ByVal callbackDelegate As ExampleCallback)
boilerplate = text
value = number
callback = callbackDelegate
End Sub

' The thread procedure performs the task, such as
' formatting and printing a document, and then invokes
' the callback delegate with the number of lines printed.
Public Sub ThreadProc()
Console.WriteLine(boilerplate, value)
If Not callback Is Nothing Then callback(1)
End Sub
End Class

' Delegate that defines the signature for the callback method.
'
Public Delegate Sub ExampleCallback(ByVal lineCount As Integer)

' Entry point for the example.
'
Public Class Example
Public Shared Sub Main()
' Supply the state information required by the task.
Dim tws As New ThreadWithState( _
"This report displays the number {0}.", _
42, _
New ExampleCallback(AddressOf ResultCallback) _
)

Dim t As New Thread(AddressOf tws.ThreadProc)
t.Start()
Console.WriteLine("Main thread does some work, then waits.")
t.Join()
Console.WriteLine("Independent task has completed; main thread ends.")
End Sub

' The callback method must match the signature of the
' callback delegate.
'
Public Shared Sub ResultCallback(ByVal lineCount As Integer)
Console.WriteLine("Independent task printed {0} lines.", lineCount)
End Sub
End Class
[C#]
using System;
using System.Threading;

// The ThreadWithState class contains the information needed for
// a task, the method that executes the task, and a delegate
// to call when the task is complete.
//
public class ThreadWithState {
// State information used in the task.
private string boilerplate;
private int value;
// Delegate used to execute the callback method when the
// task is complete.
private ExampleCallback callback;

// The constructor obtains the state information and the
// callback delegate.
public ThreadWithState(string text, int number,
ExampleCallback callbackDelegate)
{
boilerplate = text;
value = number;
callback = callbackDelegate;
}

// The thread procedure performs the task, such as
// formatting and printing a document, and then invokes
// the callback delegate with the number of lines printed.
public void ThreadProc() {
Console.WriteLine(boilerplate, value);
if (callback != null)
callback(1);
}
}

// Delegate that defines the signature for the callback method.
//
public delegate void ExampleCallback(int lineCount);

// Entry point for the example.
//
public class Example {
public static void Main() {
// Supply the state information required by the task.
ThreadWithState tws = new ThreadWithState(
"This report displays the number {0}.",
42,
new ExampleCallback(ResultCallback)
);

Thread t = new Thread(new ThreadStart(tws.ThreadProc));
t.Start();
Console.WriteLine("Main thread does some work, then waits.");
t.Join();
Console.WriteLine("Independent task has completed; main thread ends.");
}

// The callback method must match the signature of the
// callback delegate.
//
public static void ResultCallback(int lineCount) {
Console.WriteLine("Independent task printed {0} lines.", lineCount);
}
}