【发布时间】:2020-03-05 05:35:32
【问题描述】:
我正在开发一个包含服务器和客户端的项目。 客户端每秒向服务器发送一个 UDP 数据包,根据服务器的响应,它可能会打开与服务器的 TCP 连接(并从服务器接收文件),客户端的程序有一个我不想阻止的 GUI (在 WPF MVVM 中制作),并且在 MainWindow 的构造函数上启动异步函数也是有问题的,因为构造函数不能是异步的。 所以我的问题是,我可以并且应该在后台线程上运行异步函数吗?如果异步在后台线程上是否会提高性能,我说的是这些选项之间的区别:
public MainWindow()
{
InitializeComponent();
DirectoryViewModel DirectoryVM = new DirectoryViewModel();
this.DataContext = DirectoryVM;
DirectoryVM.StartListen(); //Unwanted as constructor won't finish
}
到
public MainWindow()
{
InitializeComponent();
DirectoryViewModel DirectoryVM = new DirectoryViewModel();
this.DataContext = DirectoryVM;
Task.Run(DirectoryVM.StartListen()); //Possible but async might be faster
}
到
public MainWindow()
{
InitializeComponent();
DirectoryViewModel DirectoryVM = new DirectoryViewModel();
this.DataContext = DirectoryVM;
Task.Run(async () => await DirectoryVM.StartListenAsync()); //Is it faster than the second option?
}
据我所见,我不应该像这样在后台线程上运行异步代码,但为什么呢?它不是比在后台线程上运行同步代码更快吗? 另外我想这并没有什么不同,但是在我的服务器上,我将创建一个持续运行的线程来侦听 tcp 连接并通过它发送文件,我是否应该使发送文件函数异步?
谢谢!
【问题讨论】:
-
你在哪里启动后台线程?我只能看到
Task.Run。 -
一般来说是一个单独的线程,对不起我的理解失误。 Task.Run 是否排队到线程池?
-
第三个选项只有似乎更快,因为您不需要等待它完成。当
MainWindow退出时,DirectoryVM.StartListenAsync可能不完整,更糟糕的是,您无法知道它何时实际完成。 -
在构造函数中运行异步代码也是incredibly bad 的想法。
-
要想得到好的答案,我们必须知道
StartListen[Async]()做了什么。但看起来第一个 sn-p 就可以了。您期望这里有什么样的性能差异?这将是纳秒。
标签: c# multithreading asynchronous async-await task