如何在“BeginInvoke”中设置变量的值C# 中的委托函数?

发布于 2024-11-08 13:09:02 字数 372 浏览 3 评论 0原文

我在不同的线程上有这段代码:

string sub = "";

this.BeginInvoke((Action)(delegate()
{
    try
    {
        sub = LISTVIEW.Items[x].Text.Trim();
    }
    catch
    {

    }
}));

MessageBox.Show(sub);

我想要的是获取“LISTVIEW.Items[x].Text.Trim();”的值并将其传递给“sub”。请注意,LISTVIEW 控件位于主线程上。现在我怎样才能做到这一点?

enter code here

I have this code on different thread:

string sub = "";

this.BeginInvoke((Action)(delegate()
{
    try
    {
        sub = LISTVIEW.Items[x].Text.Trim();
    }
    catch
    {

    }
}));

MessageBox.Show(sub);

what I want is to get the value of "LISTVIEW.Items[x].Text.Trim();" and pass it to "sub". please note that the LISTVIEW control is on the main thread. now how can I accomplish this?

enter code here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你爱我像她 2024-11-15 13:09:02
        Func<string> foo = () =>
            {
                try
                {
                    return LISTVIEW.Items[x].Text.Trim();
                }
                catch
                {
                     // this is the diaper anti-pattern... fix it by adding logging and/or making the code in the try block not throw
                     return String.Empty;

                }
            };

        var ar = this.BeginInvoke(foo);

        string sub = (string)this.EndInvoke(ar);

当然,您需要小心使用 EndInvoke,因为它可能会导致死锁。

如果您更喜欢委托语法,您也可以更改

this.BeginInvoke((Action)(delegate()

this.BeginInvoke((Func<String>)(delegate()

您仍然需要从所有分支返回一些内容并调用结束调用。

        Func<string> foo = () =>
            {
                try
                {
                    return LISTVIEW.Items[x].Text.Trim();
                }
                catch
                {
                     // this is the diaper anti-pattern... fix it by adding logging and/or making the code in the try block not throw
                     return String.Empty;

                }
            };

        var ar = this.BeginInvoke(foo);

        string sub = (string)this.EndInvoke(ar);

You, of course, need to be a bit careful with EndInvoke because it can cause deadlocks.

if you prefer delegate syntax you can also change

this.BeginInvoke((Action)(delegate()

to

this.BeginInvoke((Func<String>)(delegate()

you stll need to return something from all branches and call end invoke.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文