我有一个多线程C#应用程序,其中按下按钮(Button homeBut
)开始执行给定方法的新线程。点击后,我禁用按钮并启动线程。
要重新启用按钮,我目前在方法结束时执行此操作:
if (InvokeRequired)//if accessing from different thread
{
this.Invoke(new Action<Button>(enableButton), new object[] { homeBut });
}
该方法可以返回多个位置,我希望避免将此代码段复制并粘贴到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)
以下是三种方式:
创建一个对象,当它超出范围时执行您需要做的任何事情(例如,使用using pattern)。
将功能更改为只有一条返回路径。
从外部函数调用函数,该函数在函数返回后执行您需要执行的操作。
使用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);
}
}