我们在使用C#语言编写程序时进场会用到多线程,对于初学者来说给子线程传递参数是一个头疼的问题,比如Task.Factory.StartNew只允许传递一个Object类型的参数,这是我们有很多参数如何传给子线程呢?这时我们可以使用匿名参数将多个参数同时传递给子线程。

List<Task> tasks = new List<Task>();
foreach (var linkInfo in linkInfos)
{
    tasks.Add(Task.Factory.StartNew((x) =>
    {
        var a = (dynamic)x;
        var linkInfoInstance = (LinkInfo)a.linkInfo;
        var keyWordInstance = (string)a.keyWord;
        var collectorTaskInstance = (CollectorTask)a.collectorTask;
        var count = BLL.ContainerService._ArticleInfoService.GetCountWithoutCache(new ArticleInfo() { ReferencesUrl = linkInfoInstance.Url });
        if (count == 0) CollectorTaskNewsTitle(linkInfoInstance, keyWordInstance, collectorTaskInstance);

    }, new
    {
        linkInfo = linkInfo,
        keyWord = keyWord,
        collectorTask = collectorTask
    }));
}
Task.WaitAll(tasks.ToArray());
在上面的多线程编程代码中,我们定义了一个匿名参数new {},里面包含了三个参数,这三个参数是要传递给子线程的。在子线程中,我们利用C#里面的动态参数dynamic将匿名参数进行了解析,之后只用强制转换,便在子线程中获取到了匿名参数的相关实例。