线程与Threadstart

时间:2015-04-25 07:15:21

标签: c# .net multithreading

在C#中,实际上,我没有发现以下内容之间存在任何差异:

new Thread(SomeMethod).Start();

new Thread(new ParameterizedThreadStart(SomeMethod));

new Thread(new ThreadStart(SomeMethod));

有什么区别,如果有的话?

3 个答案:

答案 0 :(得分:25)

Thread(ThreadStart)构造函数只能在SomeMethod方法的签名与ThreadStart委托匹配时使用。相反,Thread(ParameterizedThreadStart)要求SomeMethodParameterizedThreadStart代理相匹配。签名如下:

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对象并在另一个地方启动新线程,那么很多时候您的代码看起来会更好。