C#线程调用带参数的方法

方法一:

一般来说,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是 不可能 简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了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();  

方法二:
加入该句: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)
{
  // ....
}

<script type="text/JavaScript"> alimama_pid="mm_10498610_623104_1064319"; alimama_titlecolor="0000FF"; alimama_descolor ="000000"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="E6E6E6"; alimama_linkcolor="008000"; alimama_bottomcolor="FFFFFF"; alimama_anglesize="0"; alimama_bgpic="0"; alimama_icon="0"; alimama_sizecode="14"; alimama_width=728; alimama_height=90; alimama_type=2; </script> <script type="text/javascript" src="http://a.alimama.cn/inf.js"> </script>
<script charset="gb2312" src="http://www.kupoa.cn/inc/menu.js" type="text/javascript"></script> <script type="text/javascript"> jsdone=true; </script>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,可以使用Thread类来创建多个线程,并通过调用方法来启动这些线程。如果要在多线程调用参数有返回值的方法,可以使用委托和异步回调来实现。下面是一个简单的示例代码,演示如何创建和启动多个线程调用同一个参数有返回值的方法: ```csharp using System; using System.Threading; class Program { static void Main(string[] args) { // 创建3个线程 Thread t1 = new Thread(new ParameterizedThreadStart(MyMethod)); Thread t2 = new Thread(new ParameterizedThreadStart(MyMethod)); Thread t3 = new Thread(new ParameterizedThreadStart(MyMethod)); // 启动这些线程 t1.Start(1); t2.Start(2); t3.Start(3); // 等待这些线程结束 t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("所有线程已结束"); } static void MyMethod(object param) { int num = (int)param; // 这里是你要执行的方法 Console.WriteLine("线程 {0} 正在执行 MyMethod,参数为 {1}", Thread.CurrentThread.ManagedThreadId, num); // 模拟方法执行 Thread.Sleep(1000); // 返回结果 int result = num * 2; // 调用回调函数返回结果 AsyncCallback callback = new AsyncCallback(MyCallback); callback.BeginInvoke(result, null, null); } static void MyCallback(IAsyncResult result) { int num = (int)result.AsyncState; Console.WriteLine("线程 {0} 的 MyMethod 方法返回了结果 {1}", Thread.CurrentThread.ManagedThreadId, num); } } ``` 在这个示例中,我们创建了3个线程,并通过调用Thread.Start()方法来启动它们。这些线程都会调用同一个方法MyMethod(),并传入一个整数参数。在MyMethod()方法中,我们模拟了方法的执行过程,并最终返回了一个整数结果。为了返回结果,我们使用了异步回调的方式,将结果传递给MyCallback()方法进行处理。在MyCallback()方法中,我们输出了方法执行的结果。 需要注意的是,多线程编程需要注意线程安全性,以免出现竞态条件等问题。在实际开发中,需要根据具体情况来选择适合的多线程编程模型和技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值