在C#中,实际上,我没有发现以下内容之间存在任何差异:
new Thread(SomeMethod).Start();
,
new Thread(new ParameterizedThreadStart(SomeMethod));
和
new Thread(new ThreadStart(SomeMethod));
有什么区别,如果有的话?
答案 0 :(得分:25)
Thread(ThreadStart)
构造函数只能在SomeMethod
方法的签名与ThreadStart
委托匹配时使用。相反,Thread(ParameterizedThreadStart)
要求SomeMethod
与ParameterizedThreadStart
代理相匹配。签名如下:
public delegate void ThreadStart()
public delegate void ParameterizedThreadStart(Object obj)
具体而言,这意味着您应该在方法不接受任何参数时使用ThreadStart
,而在ParameterizedThreadStart
采用单个Object
参数时使用Start()
。使用前者创建的线程应该通过调用Start(Object)
来启动,而使用后者创建的线程应该通过public static void Main(string[] args)
{
Thread threadA = new Thread(new ThreadStart(ExecuteA));
threadA.Start();
Thread threadB = new Thread(new ParameterizedThreadStart(ExecuteB));
threadB.Start("abc");
threadA.Join();
threadB.Join();
}
private static void ExecuteA()
{
Console.WriteLine("Executing parameterless thread!");
}
private static void ExecuteB(Object obj)
{
Console.WriteLine("Executing thread with parameter \"{0}\"!", obj);
}
指定其参数。
Thread
最后,您可以调用ThreadStart
构造函数,而无需指定ParameterizedThreadStart
或 Thread threadA = new Thread(ExecuteA); // implicit cast to ThreadStart
threadA.Start();
Thread threadB = new Thread(ExecuteB); // implicit cast to ParameterizedThreadStart
threadB.Start("abc");
委托。在这种情况下,编译器将根据其签名将您的方法与构造函数重载相匹配,从而隐式执行转换。
<?php /* Try this code color.php */ ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>
Footer:<br> <input type="color" name="footer" class="color" >
<br><br>
Header:<br> <input type="color" name="header" class="color" >
<br><br>
Aside:<br> <input type="color" name="aside" class="color" >
<br><br>
<button id="submit">submit</button>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
jQuery(document).ready(function($) {
$('#submit').click(function(){
var obj={};
$('.color').each(function(e){
obj[$(this).attr('name')]=$(this).val();
});
$.ajax({
url: 'changecolor.php',
type: 'POST',
// dataType: 'json',
data: obj,
})
.done(function(data) {
console.log(data);
})
.fail(function() {
console.log("error");
})
.always(function() {
console.log("complete");
});
});
});
</script>
</body>
</html>
<?php /* changecolor.php */ ?>
<?php
if(isset($_POST)){
$key=array_keys($_POST);
$value=array_values($_POST);
$fields="`".implode("`,`", $key)."`";
$values="'".implode("','", $value)."'";
$sql="INSERT INTO `table_name` ({$fields}) VALUES ({$values})";
echo $sql;
}
?>
答案 1 :(得分:7)
new Thread(SomeMethod)
和new Thread(new ThreadStart(SomeMethod))
: new Thread(SomeMethod)
和new Thread(new ThreadStart(SomeMethod))
之间的区别纯粹是语法:C#编译器为这些生成相同的代码;前一版本是后一版本的缩写。
(编译器可以从可用的Thread
构造函数的签名中自动推导出要使用的正确委托类型,以及指定方法SomeMethod
的签名。写出new ThreadStart(…)
代替只是…
有点像用某个表达式的实际类型替换var
,你可以让编译器省去实际类型的工作。)
这两个版本在SomeMethod
不带参数时起作用,因为它是匹配ThreadStart
代表所需的签名。
new Thread(new ParameterizedThreadStart(SomeMethod))
上述两者与new Thread(new ParameterizedThreadStart(SomeMethod))
之间的区别在于,这一点在Thread
上调用了不同的构造函数。
并且ParameterizedThreadStart
禁止使用与ThreadStart
不同的方法签名:您的SomeMethod
需要使用object
类型的一个参数,否则它与此委托类型不匹配。
答案 2 :(得分:1)
不,但是如果您在一个地方创建ThreadStart对象并在另一个地方启动新线程,那么很多时候您的代码看起来会更好。