[英]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);
这是三种方式:
创建一个对象,该对象在超出范围时会执行任何操作(例如,使用using模式 )。
将函数更改为仅具有单个返回路径。
从外部函数调用该函数,该外部函数在函数返回后将执行您需要做的任何事情。
使用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.