【问题标题】:How to pass a value to a anonym method in Task.Factory如何将值传递给 Task.Factory 中的匿名方法
【发布时间】:2013-05-03 16:50:41
【问题描述】:

我正在使用这样的构造:

string myurl = "http://google.de";
Task.Factory.StartNew(() =>
{
   MessageBox.Show(url);
});

如何将myurl传递给匿名函数?

【问题讨论】:

    标签: c# parameters parameter-passing task anonymous-function


    【解决方案1】:

    直接使用即可:

    string myurl = "http://google.de";
    Task.Factory.StartNew(() =>
    {
       MessageBox.Show(myurl);
    });
    

    这称为“闭包”。

    如果您不想这样做,则可以将 url 作为另一个参数传递给StartNew

    string myurl = "http://google.de";
    Task.Factory.StartNew(url =>
    {
       MessageBox.Show((string)url);
    }, myurl);
    

    第二个版本的代码有点多,它限制你只能使用一个参数(所以如果你有多个参数,你需要使用闭包或将所有参数放入某个容器对象中)并且还将参数键入到 @ 987654324@,从而迫使您将其转换为方法体中的真实内容。另一方面,优点是与关闭变量相关的开销很小,使用此方法可能会避免这些开销。请注意,在大多数情况下,这不会是一个重要的性能问题,因此您应该选择最方便的方法,除非您有理由不这样做。

    【讨论】:

    • 感谢您的回答。但还有一个问题。如果将值放在 GUI 控件中,是否会出现问题(跨线程)?还是闭包也解决了这个问题?
    • @netblognet 如果您尝试从非 UI 线程访问控件,则会收到错误消息。您如何确保会因情况而异。
    • 我知道,我会得到一个错误。 ;) 因此,在上述示例中从控件访问数据时,我将不得不使用您回答中的第二个示例。
    • @netblognet 如果您想从控件中获取数据,最好在调用StartNew 之前从控件中获取数据,即如果您希望文本框的文本不要关闭在文本框上获取文本,获取文本并将其存储在字符串变量中,然后调用StartNew 并关闭该字符串。
    猜你喜欢
    • 2012-11-24
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多