繁体   English   中英

返回时的C#调用方法

[英]C# Call Method On Return

我有一个多线程C#应用程序,其中按下按钮( Button homeBut )开始一个新线程,该线程执行给定的方法。 单击时,我禁用按钮并启动线程。

要重新启用按钮,我目前在方法末尾执行此操作:

if (InvokeRequired)//if accessing from different thread
    {
        this.Invoke(new Action<Button>(enableButton), new object[] { homeBut });
    }

该方法可以从多个地方返回,我希望避免将此代码片段复制并粘贴到4个不同的地方,以确保始终重新启用该按钮。

有什么方法可以在方法返回时执行这样的代码块,以便我只编写一次?

我希望避免将此代码段复制并粘贴到4个不同的位置,以确保始终重新启用该按钮。

好吧,关于一种方法,通常就是它们的用途。

void EnableHomeButton()
{
    if (InvokeRequired)//if accessing from different thread
    {
        this.Invoke(new Action<Button>(enableButton), new object[] { homeBut });
    }
    else
    {
        enableButton(homeBut);
    }
}

还要避免创建自己的线程。 启动任务

DisableButton();
Task.Factory.StartNew(DoWhatEver).ContinueWith(EnableHomeButton);

这是三种方式:

  1. 创建一个对象,该对象在超出范围时会执行任何操作(例如,使用using模式 )。

  2. 将函数更改为仅具有单个返回路径。

  3. 从外部函数调用该函数,该外部函数在函数返回后将执行您需要做的任何事情。

  4. 使用try / finally

您可能会考虑的另一种解决方案是:

private async void SomeButtonClicked(object sender, EventArgs e)
{
    try
    {
        DisableButton();
        await ALongRunningTaskAsync();
    }
    finally
    {         
        EnableButton();
    }
}

通过使用async / await,您知道程序将切换回原始线程,在这种情况下,将切换回UI线程,甚至try-finally都将起作用。 只要确保ALongRunningTaskAsync返回一个Task(或Task)

我不太清楚您如何调用线程。 请指定。 如果正在使用BeginInvoke调用功能/线程,则可以指定“异步回调”方法,该方法将在线程末尾触发。

以下是代码的工作示例

class Program
{
    static void Main(string[] args)
    {
        Del del = new Del(Notify);
        del.BeginInvoke("abc", callback, new object { });
    }

    private static void callback(IAsyncResult ar)
    {
       if (InvokeRequired)//if accessing from different thread
       {
        this.Invoke(new Action<Button>(enableButton), new object[] { homeBut });
       }
       Console.Write("Callback Triggerd. Thread Completed");
    }
    // Declare a delegate. 
    delegate void Del(string str);

    // Declare a method with the same signature as the delegate. 
    static void Notify(string name)
    {
        Console.WriteLine("Notification received for: {0}", name);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM