C# Task.Run()的回调方法

C# Task.Run()的回调方法,c#,C#,目前,我的代码变得非常重复。在整个软件过程中,我必须反复调高忙指示灯 这三项行动是: 1. Raise Busy Indicator 2. Do the actions 3. Turn Off Busy Indicator 范例 public async void OpenAttachment() { Events.PublishOnUIThread(new BusyEvent { IsBusy = true }); await Task.Run(() => {

目前,我的代码变得非常重复。在整个软件过程中,我必须反复调高忙指示灯

这三项行动是:

1. Raise Busy Indicator
2. Do the actions
3. Turn Off Busy Indicator
范例

public async void OpenAttachment()
{
    Events.PublishOnUIThread(new BusyEvent { IsBusy = true });
    await Task.Run(() =>
    {
        try
        {
            if (SelectedAttachment == null)
            {
                return;
            }

            var tempFile = string.Format(
                "{0}\\{1}.{2}", Path.GetTempPath(), SelectedAttachment.FileName, SelectedAttachment.FileExtension);

            System.IO.File.WriteAllBytes(tempFile, UnitOfWork.FileRepository.GetFileBytes(SelectedAttachment.Id));

            Process.Start(tempFile);
        }
        catch (Exception ex)
        {
            Notification.Error("Person - Opening attachment", "File couldn't open, please close last file instance.");
        }
    });
    Events.PublishOnUIThread(new BusyEvent { IsBusy = false });
}
我希望运行一个方法,这样它就可以执行busy指示符,而不必每次都重复它

差不多

public async void OpenAttachment()
{
    Execute(() => await Task.Run(() => {....TaskWork});
}

想知道是否有人能给我一些关于如何减少重复代码的提示。

你的意思是这样的

public async Task RunBusyTask(Action task)
{
    Events.PublishOnUIThread(new BusyEvent { IsBusy = true });
    await Task.Run(task);
    Events.PublishOnUIThread(new BusyEvent { IsBusy = false });
}


C#使用授权人进行授权。。。查看文档…如果您只需要回调,那么您可以使用良好的旧
ContinueWith()
。不要使用
async void
,它只允许用于使您的方法签名与事件处理程序兼容。您的函数似乎不是一个事件处理程序,因此它应该执行
异步任务
。它是一个事件处理程序,我使用的是Caliburn Micro,它使事情变得更简单@ScottChamberlainI将使其成为
异步任务
而不是
asnyc void
,因此您可以执行
等待RunBusyTask(()=>{…})。Asnyc void只应用于使方法签名与事件处理程序兼容。@ScottChamberlain很好的一点,通常最好返回
任务
,除非您需要事件的方法。您实际上应该只接受
任务
,或
函数
,因为该任务可能不代表CPU限制的工作。
RunBusyTask(() => {...});