线程问题,请教

一枚大帅哥 2016-05-10 11:43:45
在c#中, 创建一个线程, 线程委托能用引用类型的参数?
class Program
{
static void Main(string[] args)
{
Hashtable tb=new Hashtable();
ParameterizedThreadStart tStart = new ParameterizedThreadStart(Calculate);
Thread thread = new Thread(tStart);
thread.Start(tb);//传递参数

Thread.Sleep(2000);
Console.Read();
}
public static void Calculate(ref Hashtable arg)
{
//处理该HashTable
}
}


目前报错:no overload for"Calculate" matches delegate “ParameterizedThreadStart”
...全文
190 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
一枚大帅哥 2016-06-01
  • 打赏
  • 举报
回复
最后还是没弄好!还是换种方式吧!
  • 打赏
  • 举报
回复
具体地说,就是写
var x = 1;
ThreadPool.QueueUserWorkItem(h =>
{
    x++;
    Console.WriteLine(x);
    Calculate(x);
});
这里也还是随便写你的代码,不用管什么“参数签名问题”。
  • 打赏
  • 举报
回复
不过,如果你大量是用线程,我建议你使用系统线程池去智能地调度线程重用机制。虽然创建 Thread 实例一开始看起来挺快的,但是如果软件稍微复杂一点,它很快就把windows 系统资源平衡机制搞跨了。.net 系统线程池则可以比较好地做到这一点。
  • 打赏
  • 举报
回复
你可以使用匿名委托方式调用任何代码,例如
var x = 1;
var t = new Thread(() =>
{
     x ++;
    Console.WriteLine(x);
    Calculate((x);
});
t.Start();
完全不用顾忌什么“参数签名问题”。
Poopaye 2016-05-10
  • 打赏
  • 举报
回复
把ref去掉,我不明白为什么你这里一定要这个ref
xian_wwq 2016-05-10
  • 打赏
  • 举报
回复
引用 楼主 wuyajungogo 的回复:
在c#中, 创建一个线程, 线程委托能用引用类型的参数?
class Program
{
static void Main(string[] args)
{
Hashtable tb=new Hashtable();
ParameterizedThreadStart tStart = new ParameterizedThreadStart(Calculate);
Thread thread = new Thread(tStart);
thread.Start(tb);//传递参数

Thread.Sleep(2000);
Console.Read();
}
public static void Calculate(ref Hashtable arg)
{
//处理该HashTable
}
}
目前报错:no overload for"Calculate" matches delegate “ParameterizedThreadStart”
public static void Calculate(ref Hashtable arg) 改为 public static void Calculate(object Hashtable arg) 接收到后进行强制转换
xian_wwq 2016-05-10
  • 打赏
  • 举报
回复
引用 1 楼 wuyajungogo 的回复:
报错应该是方法签名与ParameterizedThreadStart不匹配把。但是我确实要用引用类型的参数,这里怎么破呢?
上贴打错了 public static void Calculate(object arg)
一枚大帅哥 2016-05-10
  • 打赏
  • 举报
回复
报错应该是方法签名与ParameterizedThreadStart不匹配把。但是我确实要用引用类型的参数,这里怎么破呢?
一枚大帅哥 2016-05-10
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
你完全可以写
Calculate(ref tb);
啊?!我不过就是用 Calculate(x); 来举例嘛。我都比较明确地说了“你可以调用任何代码”喽。
啊。对啊,等等我试试去先
  • 打赏
  • 举报
回复
你完全可以写
Calculate(ref tb);
啊?!我不过就是用 Calculate(x); 来举例嘛。我都比较明确地说了“你可以调用任何代码”喽。
  • 打赏
  • 举报
回复
引用 10 楼 wuyajungogo 的回复:
你这个方法确实比较好用,但是有没有其他办法,可以让我不改动Calculate函数吗?
晕死!谁让你改动 Calculate 函数了? 我还特意写了一行代码 x++ 用来说明 ref 相同的意思。
一枚大帅哥 2016-05-10
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
你可以使用匿名委托方式调用任何代码,例如
var x = 1;
var t = new Thread(() =>
{
     x ++;
    Console.WriteLine(x);
    Calculate((x);
});
t.Start();
完全不用顾忌什么“参数签名问题”。
你这个方法确实比较好用,但是有没有其他办法,可以让我不改动Calculate函数吗?
Poopaye 2016-05-10
  • 打赏
  • 举报
回复
引用 8 楼 wuyajungogo 的回复:
[quote=引用 4 楼 shingoscar 的回复:] 把ref去掉,我不明白为什么你这里一定要这个ref
就是要用ref才来提问的。 这个绑定到线程上的Calculate函数在别的地方也有很多次调用,不能随便改![/quote] 那就包一下呗
public static void Calculate2(Hashtable arg)
{
     Calculate(ref arg);
}
一枚大帅哥 2016-05-10
  • 打赏
  • 举报
回复
引用 4 楼 shingoscar 的回复:
把ref去掉,我不明白为什么你这里一定要这个ref
就是要用ref才来提问的。 这个绑定到线程上的Calculate函数在别的地方也有很多次调用,不能随便改!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧