您的位置:首页 > 编程语言 > C#

C#线程进程总结

2013-10-15 13:03 429 查看
1、新建一个线程,执行一个无参无返回值的方法。

using System.Threading;
ThreadStart threadStart = new ThreadStart(ThreadMethod);
Thread thread = new Thread(threadStart);
thread.Start();
thread.Abort();


2、如果需要执行带参数的线程:msdn中推荐的方法是间接调用

class thd
{
int x;
int y;
public thd(int xx, int yy){x=xx;y=yy;}
public void thstart(){start(x,y);}
public void start(int a,   int b){...}

}
thd   t   =   new   thd(3,4);
TheadStart   myd   =   new   TheadStart(t.thstart);


一般来说,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能 简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。  

现在用一个用线程控制的进程条来说明,大致的步骤如下: 

方法一:

1.创建Invoke函数,大致如下:
/// <summary>
/// Delegate function be invoked by main thread
/// </summary>
private     void     InvokeFun()
{
if(prgBar.Value< 100)
prgBar.Value = prgBar.Value + 1;
}

2.子线程入口函数:
/// <summary>
/// Thread function interface
/// </summary>
private void ThreadFun()
{
// Create invoke method by specific function
MethodInvoker mi = new MethodInvoker(this.InvokeFun);

for(int i=0; i<100; i++)
{
this.BeginInvoke(mi);
Thread.Sleep(100);
}
}

3.创建子线程:
Thread thdProcess = new Thread(new ThreadStart(ThreadFun));
thdProcess.Start();

备注:
using System.Threading;
private System.Windows.Forms.ProgressBar prgBar;


方法二:

加入该句:Control.CheckForIllegalCrossThreadCalls = False    取消线线程安全保护模式!
方法三:带参数
使用类、类的方法或类的属性都可以向线程传递参数:

public class UrlDownloader
{
string url;

public UrlDownloader (string url)
{
this.url = url;
}

public void Download()
{
WebClient wc = new WebClient();
Console.WriteLine("Downloading " + url);
byte[] buffer = wc.DownloadData (url);
string download = Encoding.ASCII.GetString(buffer);
Console.WriteLine(download);
Console.WriteLine("Download successful.");

//这里你可以将download进行保存等处理......
}
}

[... 在另一个类中使用它们...]

UrlDownloader downloader = new UrlDownloader (yourUrl);
new Thread (new ThreadStart (downloader.Download)).Start();


方法四:带参数
ThreadStart starter = delegate { Download(yourUrl); };

new Thread(starter).Start();

//使用线程池

WaitCallback callback = delegate (object state) { Download ((string)state); };

ThreadPool.QueueUserWorkItem (callback, yourUrl);
方法五:带参数

Thread t = new Thread (new ParameterizedThreadStart(DownloadUrl));

t.Start (myUrl);

static void DownloadUrl(object url)

{

  // ....

}
C#进程操作

总结一下进程的新建和终止的操作过程。看代码:

public int CallPhoneExe(string arg) //arg为进程的命令行参数
{ WaitHandle[] waits =new WaitHandle[2]; //定义两个WaitHandle值,用以控制进程的执行过程
waits[0] = HSTOP; //AutoResetEvent HSTOP = new AutoResetEvent(false);
waits[1] = GlobalStop;//AutoResetEvent GlobalStop = new AutoResetEvent(false);
int iReturn=0;
Process p = new Process();//新建一个进程
p.StartInfo.Arguments = arg; //进程的命令行参数
p.StartInfo.FileName = filepath;//进程启动路径

p.StartInfo.CreateNoWindow = true;//不显示新进程的窗口
p.StartInfo.RedirectStandardOutput = true;//输出重定向
p.StartInfo.RedirectStandardError = true;   //Redirect the error ouput!
p.StartInfo.UseShellExecute = false;
p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

p.EnableRaisingEvents = true;
p.Exited += new EventHandler(p_Exited); //进程自然结束后启动p—Exited事件
p.OutputDataReceived += new DataReceivedEventHandler(ChangeOutput);//进程有输出时,启动ChangeOutPut函数

p.Start();//进程启动
p.BeginOutputReadLine();

int hstop = WaitHandle.WaitAny(waits);//启动线程暂停,知道WaitHandle中传来有效信号
switch (hstop)//判断信号是又哪个
{
case 0: //进程自然结束
if (p.WaitForExit(2000))
iReturn = p.ExitCode; //获取进程的返回值
else
{
CloseProcess();
iReturn = -2;
}
break;
case 1: //进程被迫结束
p.Kill();//杀掉进程
if (!p.HasExited)
{
p.Kill();
}
iReturn = -3;
break;
}
HSTOP.Reset(); //HSTOP复位,这个变量指示进程自然结束,每次结束后都得自然复位
p.Close(); //创建的p关闭
return iReturn;
}

private void p_Exited(object sender, EventArgs e)
{
HSTOP.Set();
}

//输出重定向函数
private void ChangeOutput(object sendingProcess, DataReceivedEventArgs outLine)
{
if (!String.IsNullOrEmpty(outLine.Data)) //字符串不为空时
MainForm.FireWriteText(outLine.Data,false);//将进程的输出信息转移
}



快乐云点播助手

关闭
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: