最近,我开始学习C#,编写一个简单的应用程序,根据写入该目录中文件的行来监视目录和更新表单。在尝试从InvalidOperationException
事件更新表单元素时,我在某些时候遇到了常见的FileWatcher
。
我搜索了stackoverflow,似乎我should在这种情况下使用基于任务的异步模式(TAP),但我无法弄清楚我应该将哪个方法标记为async
,以Task
开头。 stackoverflow上有很多相关的问题,但我找不到我的应用程序的所有3个方面:
FileWatcher
Form
元素那么,如果我想使用基于任务的异步模式,那么从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
方法的委托来完成它并且它正常工作(我希望这是一个正确的决定)。
感谢您的回复!