在过去的几个月里,我一直在阅读C#中的async-await以及如何正确使用它.
出于实验练习的目的,我正在构建一个小型Tcp服务器,该服务器应该为连接它的客户端提供服务.该程序是一个控制台应用程序.
我使用while循环来等待连接,如下所示:
while (!_isStopRequested)
{
TcpClient client = await _tcpListener.AcceptTcpClientAsync();
await Task.Factory.StartNew(() => ProcessClientAsync(client), TaskCreationOptions.LongRunning);
}
Run Code Online (Sandbox Code Playgroud)
所以,到目前为止,我所做的ProcessClientAsync方法被标记为async void,我只是将其称为ProcessClientAsync(客户端),并且调用将立即返回给调用者.但是我在网上看到,除非是为了一个活动,否则使用它是一个糟糕的决定.所以我将定义更改为异步任务.
好的,但没有等待,我在Visual Studio中收到警告"因为没有等待此调用,当前方法在调用完成之前继续运行".
一旦我使用了等待ProcessClientAsync(客户端),代码就不起作用了.我只能连接一个客户端,然后调用者"等待"ProcessClientAsync返回.但是,该方法具有无限循环并且不会返回,但我需要while循环来继续处理下一个客户端.
谷歌搜索我来到这个线程: 如何在没有等待的情况下安全地调用C#中的异步方法
我想问题几乎是一样的,除了当我使用await ProcessClientAsync时,我希望它立即返回到调用者,它不会这样做,我知道因为运行第二个客户端,而第一个客户端仍在运行,第二个客户端没有连接.
所以我这样做了:
await Task.Factory.StartNew(() => ProcessClientAsync(client), TaskCreationOptions.LongRunning);
Run Code Online (Sandbox Code Playgroud)
但是由于ProcessClientAsync必须返回一个Task,我不确定这是否可以.
那将是一个问题.
另一个是:我怎么能调用一个永远运行的异步Task方法,让调用立即返回调用者,这样while循环可以继续,tcp监听器可以继续接受下一个客户端?
谢谢.
对不起,如果是重复,或不清楚我在问什么.
我是手把和骨干的新手,我现在正试图在我的网页上预编译车把模板.然而,发生的事情是把手或骨干,我不知道哪个,在DOM中添加一个空字符串.我不知道为什么.当我在骨干视图中编译模板时,同样的事情不会发生.
对我来说更奇怪的是,我有一个预编译的车把模板,这不会发生......
这是预编译时html的图片:

这是在骨干视图中编译时的图片:

有谁知道为什么会这样?
我试图通过仅编译不接受任何数据的最简单模板并查看问题的文件来简化预编译模板文件...我已经更改了返回字符串,但它没有解决问题所以我认为问题必须在骨干内的某个地方......
简单的模板:
<div id="channelsContainer"></div>
<div>
<div id="postsContainer"></div>
<div>
<div id="contentContainer"></div>
<div id="detailsContainer"></div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
从骨干视图中的模板函数返回预编译模板:
template: function(data)
{
return Handlebars.templates['shell.html'];
}
Run Code Online (Sandbox Code Playgroud)
在视图中编译时返回模板:
template: function(data)
{
var handlebarTemplate = Handlebars.compile('<div id="channelsContainer"></div> \
<div> \
<div id="postsContainer"></div> \
<div> \
<div id="contentContainer"></div> \
<div id="detailsContainer"></div> \
</div> \
</div>');
return handlebarTemplate;
}
Run Code Online (Sandbox Code Playgroud)
在相同的骨干视图中,在initialize方法中:
this.$el.empty().html(this.template());
Run Code Online (Sandbox Code Playgroud)
非常感谢任何有关弄清楚正在发生的事情的帮助.
我正在阅读Scala中的Functional Programming,在第04章中,作者自己实现了Option.现在,在定义函数时,getOrElse他们使用上限将类型限制A为超类型(如果正确理解)
所以,定义如下:
sealed trait Option[+A] {
def getOrElse[B >: A](default: => B): B = this match {
case None => default
case Some(a) => a
}
}
Run Code Online (Sandbox Code Playgroud)
所以,当我们有类似的东西时
val a = Some(4)
println(a.getOrElse(None)) => println prints a integer value
val b = None
println(b.getOrElse(Some(3)) => println prints a Option[Integer] value
Run Code Online (Sandbox Code Playgroud)
a有类型Option[Int],所以A是类型Int.B将是类型Nothing.Nothing是每种其他类型的子类型.这意味着它Option[Nothing]是Option[Int](由于协方差)的子类型,对吧?
但是B >: A我们说过B必须要超类型?!那我们怎么能 …
我正在尝试在前端使用 Vue 和 Monaco Editor 并在后端使用 Asp.Net Core 3 制作一个 Web 应用程序。\n我也在使用 webpack,因为我使用的是 Vue 单页面组件。\n我是 webpack 的新手,并且不了解其所有功能。不管怎样,webpack 将构建分割成几个文件(看起来是块)。但是,在加载网页时,我不断收到错误Uncaught (in promise) ChunkLoadError: Loading chunk 2 failed.\n我尝试用谷歌搜索答案,但到目前为止我所做的一切都不起作用。
这是我的 package.json 和 webpack.config.json。
\n包.json
\n {\n "name": "parvis",\n "version": "1.0.0",\n "description": "This is a description",\n "main": "main.js",\n "scripts": {\n "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",\n "serve": "cross-env NODE_ENV=development webpack --devtool source-map --progress --hide-modules",\n "build": "cross-env NODE_ENV=production webpack --progress --hide-modules"\n },\n "keywords": [\n "dataflow"\n ],\n "author": "Marin Agli\xc4\x87 \xc4\x8cuvi\xc4\x87",\n "license": "MIT",\n …Run Code Online (Sandbox Code Playgroud) .net ×1
asp.net-core ×1
async-await ×1
asynchronous ×1
backbone.js ×1
c# ×1
javascript ×1
optional ×1
scala ×1
type-systems ×1
vue.js ×1
webpack ×1