如何使用基于任务的异步模式(TAP)从FileWatcher事件更新GUI

时间:2017-07-18 12:19:48

标签: c# winforms asynchronous task file-watcher

最近,我开始学习C#,编写一个简单的应用程序,根据写入该目录中文件的行来监视目录和更新表单。在尝试从InvalidOperationException事件更新表单元素时,我在某些时候遇到了常见的FileWatcher

我搜索了stackoverflow,似乎我should在这种情况下使用基于任务的异步模式(TAP),但我无法弄清楚我应该将哪个方法标记为async ,以Task开头。 stackoverflow上有很多相关的问题,但我找不到我的应用程序的所有3个方面:

  • 使用FileWatcher
  • 更新Form元素
  • 使用TAP

那么,如果我想使用基于任务的异步模式,那么从FileWatcher触发事件更新Form元素的最佳做法是什么?或者我应该使用其他模式/其他应用程序结构吗?

以下是我的应用的简化示例:

// Form
public partial class FormMain : Form, IDisplayInterface
{
    private CoreClass coreClass;

    public void SetSomeVaue(string value)
    {
        label.Text = value;
    }

    public FormMain()
    {
        coreClass = new CoreClass();
        coreClass.StartFileWatcher();
    }

    private void FormMain_Shown(object sender, EventArgs e)
    {
        coreClass.DisplayInterface = this;
    }
}

// Interface
interface IDisplayInterface
{
    void SetSomeVaue(string value);
}

// CoreClass
class CoreClass
{
    public IDisplayInterface DisplayInterface;

    public void StartFileWatcher()
    {
        FileSystemWatcher watcher = new FileSystemWatcher("C:\Some\Folder")
        {
            NotifyFilter = NotifyFilters.Size
        };
        watcher.Changed += new FileSystemEventHandler(FileUpdated);
        watcher.EnableRaisingEvents = true;
    }

    private void FileUpdated(object source, FileSystemEventArgs e)
    {
        ParseFile(Path.Combine("C:\Some\Folder", e.Name));
    }

    private void ParseFile(string File)
    {
        // foreach (var line in newFileLines)
            ParseNewRecord(line);
    }

    private void ParseNewRecord(string line)
    {
        if (someCondition && DisplayInterface != null)
        {
            // This triggers Exception for accessing FormMain from a thread that did not create it
            DisplayInterface.SetSomeValue(someValue);
        }
    }

}

更新21.07

看起来我对使用TAP 无处不在有错误的想法,所以我最终通过调用包含我的SetSomeVaue方法的委托来完成它并且它正常工作(我希望这是一个正确的决定)。

感谢您的回复!

0 个答案:

没有答案