请考虑以下Windows窗体代码:
private async void UpdateUIControlClicked(object sender, EventArgs e)
{
this.txtUIControl.Text = "I will be updated after 2nd await - i hope!";
await Task.Delay(5000).ConfigureAwait(continueOnCapturedContext: false);
this.txtUIControl.Text = "I am updated now.";
}
Run Code Online (Sandbox Code Playgroud)
这里异常是在第3行引发的,因为在等待代码在非UI线程上执行之后.ConfigureAwait(false)有用吗?
public async Task<string> GetName(int id)
{
Task<string> nameTask =
Task.Factory.StartNew(() => { return string.Format("Name matching id {0} = Developer", id); });
return nameTask.Result;
}
Run Code Online (Sandbox Code Playgroud)
在上面的方法return语句我使用Task.Result属性.
public async Task<string> GetName(int id)
{
Task<string> nameTask =
Task.Factory.StartNew(() => { return string.Format("Name matching id {0} = Developer", id); });
return await nameTask;
}
Run Code Online (Sandbox Code Playgroud)
我在这里使用等待任务.如果我认为await将释放调用线程但是Task.Result将阻止它,我会不会错,它会是正确的吗?
刚从MSDN网站安装Visual Studio 2017(完整版).创建了一个新的Asp.Net核心Web应用程序(.Net Framework),并选择了.net framework 4.6.项目名称="WebApplicationWithTemplate"
添加了另一个类库类(.Net Standard)的项目,并选择了.net framework 4.6.项目名称="DataAccessRegular"
接下来尝试将类库项目的引用添加到Asp.Net Core Web应用程序,我收到此错误:
找不到 'E:\ Development\VS2017Solution\DataAccessRegular\DataAccessRegular.csproj'的项目信息.这可能表示缺少项目参考.WebApplicationWithTemplate C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Enterprise\MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.targets 92
还创建了类库(.net核心)项目[未在上面的屏幕截图中显示]并添加了对asp.net核心项目的引用并仍然得到相同的错误.
另请阅读github上的这个链接,但遗憾的是没有找到它.
问这个问题的关键是因为我想将模型,服务和数据访问层保留在一个单独的项目中.
看完这个帖子我也能理解之间的差异AddTransient,AddScoped以及AddSingleton然而,我无法看到他们每个人的实际使用情况.
我的理解是
AddTransient
每次客户端请求时创建一个新实例.
services.AddTransient<IDataAccess, DataAccess>();
Run Code Online (Sandbox Code Playgroud)
每次客户端代码请求时,都会返回一个新的DataAccess对象.更可能是构造函数.
AddTransient的用法
如果我们必须访问数据库来读取和更新它并销毁访问对象(DataAccess),最好使用它AddTransient- 不确定线程安全性.
AddScopped
为每个http Web请求创建一个新实例.
AddScopped的用法
services.AddScoped<ShoppingCart>(serviceProvider => ShoppingCart.GetShoppingCart(serviceProvider));
Run Code Online (Sandbox Code Playgroud)
这意味着每个Web请求将具有其自己的购物车实例,该实体意味着每个用户/客户端将具有用于该http Web请求的其自己的购物车实例.
AddSingleton
为所有http Web请求创建单个实例.
AddSingleton的用法
在示例应用程序中找到此代码,但我不明白它是如何有用的.
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)
有人可以提供一个体面的实际例子,何时使用AddSingleton并检查我对AddTransient和AddScopped的理解是否正确?
通过Visual Studio安装ASP.Net Core ==>新建项目==> Web ==> ASP.Net Web应用程序==>确定==> ASP.Net 5模板.安装后重新启动系统,然后创建一个ASP.NET 5 Template ==> Empty website的新项目.我没有得到任何intellisense和所有类名称都是RED,就好像Visual Studio或Resharper无法找到定义.
并没有智能感知
当使用服务对象时,我期待服务.AddSingleton,service.AddScoped services.AddTransient service.AddLogging等...
我已经重新启动了可视化工作室,但结果仍然相同,但项目编译并按预期运行,但很难在没有智能感知支持的情况下找出新的api.
我有安装了更新1的resharper v 9.
谢谢!
在MVC控制器的操作方法中使用async/await可以扩展Web应用程序,因为等待Asp.Net线程池的请求线程被释放,以便它可以处理IIS队列中的此工作进程的其他请求.这意味着如果我们将工作进程的队列长度限制为10,并向异步操作发送50-100个请求,则IIS不应返回HTTP 503错误,因为始终存在从Asp.Net线程池到服务器的空闲线程来电请求.
我有一个WebApi进行如下计算:
public class ValuesController : ApiController
{
public int GetSum(int x, int y, int timeDelay = 1)
{
Thread.Sleep(timeDelay*1000);
int result = x + y;
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
此操作方法只是在将总和结果返回给调用代码之前延迟给定的秒数.非常基本的web api只是为了模仿长时间运行的代码.
接下来是等待结果的MVC异步操作:
public class ThreadStarvationController : Controller
{
public async Task<ActionResult> CallGetSumWithDelayAsync(int num1 = 5, int num2 = 8, int timeDelay = 60)
{
int callingThreadId = Thread.CurrentThread.ManagedThreadId;
ThreadStarvationModel model = new ThreadStarvationModel();
string url = "http://localhost:8111/api/values/GetSum?x=" + num1 + "&y=" + num2 + "&timeDelay=" + timeDelay;
using …Run Code Online (Sandbox Code Playgroud) 使用以下代码:
public class test
{
public static void DoSomething()
{
Console.WriteLine("test");
}
}
public class test2
{
public test2()
{
var a = new test();
a.DoSomething(); // invalid
test.DoSomething(); // is valid
}
}
Run Code Online (Sandbox Code Playgroud)
我需要通过基类访问静态方法,而不是通过实例.
但是,让用户通过实例访问它会有什么不利之处呢?在我看来,它有助于提高可读性.