返回时的C#调用方法

时间:2014-08-20 12:44:30

标签: c# multithreading

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

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

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

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

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

4 个答案:

答案 0 :(得分:3)

  

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

嗯,一个方法怎么样,通常是它们的用途。

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

还要避免创建自己的线程。开始Tasks

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

答案 1 :(得分:2)

以下是三种方式:

  1. 创建一个对象,当它超出范围时执行您需要做的任何事情(例如,使用using pattern)。

  2. 将功能更改为只有一条返回路径。

  3. 从外部函数调用函数,该函数在函数返回后执行您需要执行的操作。

  4. 使用try / finally

答案 2 :(得分:1)

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

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

通过使用async / await你知道程序将切换回原始线程,在这种情况下是UI线程,甚至try-finally也可以。只需确保ALongRunningTaskAsync返回任务(或任务)

答案 3 :(得分:0)

我不清楚你是如何调用一个线程的。请注明。 如果使用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);
    }
}