为什么这样有效:
using (var ms = new MemoryStream())
{
using (var dummy = new StreamWriter(ms))
{
var sw = new StreamWriter(ms);
sw.WriteLine("Hello World");
sw.Flush();
using (StreamReader rdr = new StreamReader(ms))
{
ms.Position = 0;
textBoxExc.Text = rdr.ReadToEnd();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用("无法访问封闭的流."):只有差异var dummy = XmlWriter.Create(ms)而不是var dummy = new StreamWriter(ms)
using (var ms = new MemoryStream())
{
using (var dummy = XmlWriter.Create(ms))
{
var sw = new StreamWriter(ms);
sw.WriteLine("Hello World");
sw.Flush();
using (StreamReader rdr = new StreamReader(ms))
{
ms.Position = …Run Code Online (Sandbox Code Playgroud) 在WebForms ASP.NET站点(IIS,单个应用程序池)中,我调用了Visual Studio中引用的冗长Web服务方法作为服务引用(.NET 4.0).不幸的是,在向用户提供页面之前,我必须等待来自Web服务的信息.当前Web服务是同步调用的,因此服务器无法重用当前线程来处理对性能有影响的其他请求.
当然我可以在Visual Studio中为服务引用生成异步操作BeginGetFoo而不是调用GetFoo,但我仍然必须等待来自Web服务的结果.
这是个问题.如果我使用AsyncWaitHandle.WaitOne(如下所示),我今天使用的同步调用在整个应用程序性能方面是否会更好?
IAsyncResult result = fooSoapClient.BeginGetFoo();
result.AsyncWaitHandle.WaitOne();
var foo = fooSoapClient.EndGetFoo(result);
Run Code Online (Sandbox Code Playgroud)
当然,如果等待可以做得更好,我愿意接受建议.
为什么C#本身不支持基于参数类型通过"动态重载"进行双重调度?我发现这需要动态调度,但由于虚拟方法调用也是动态调度的,因此对语言来说并不奇怪.那么为什么这个功能不属于C#呢?使用Reflection实现此功能的最优雅的解决方案是什么(可能有一些库)?
class Program
{
static void Main(string[] args)
{
var objs = new object[] { new Class1(), new Class2() };
foreach (var item in objs)
{
Method(item);
}
}
static void Method(Class1 obj)
{
}
static void Method(Class2 obj)
{
}
}
class Class1
{
}
class Class2
{
}
Run Code Online (Sandbox Code Playgroud)
确实更新了,因为Method在这个例子中不是虚拟的并且只采用一个参数,这仍然是单一调度,但是只要它> 0,调度的"基数"在这个问题中并不重要.
我正在使用Entity Framework 4.2(EntityFramework.dll v4.0.30319)Code First,并具有LINQ查询,该查询可以简化为:
IQueryable<Test> testQuery = from test in repository.Tests select test;
Run Code Online (Sandbox Code Playgroud)
将repository.Tests被IQueryable<Test>直接实现为DbSet<Test>在Enity框架的DbContext。
我注意到我的查询在某种程度上区分大小写,而Microsoft SQL Server数据库中的区分大小写排序规则。可疑,所以我想跟踪SQL。但是当我这样做时:
var trace = ((ObjectQuery<Test>)testQuery).ToTraceString();
Run Code Online (Sandbox Code Playgroud)
我得到异常:
无法转换类型为'System.Linq.EnumerableQuery
1[Entities.Test]' to type 'System.Data.Objects.ObjectQuery1 [Entities.Test]'的对象。
为什么会这样?
Microsoft ASP.NET Universal Providers 1.1昨天与System.Web.Providers 1.2一起发布.在后面的nuget页面上说明:Legacy package, System.Web.Providers is now included in the 'Microsoft.AspNet.Providers' package.
这只是名称更改还是更有趣/更重要的内容?如果我System.Web.Providers引用Microsoft.AspNet.Providers1.1和Microsoft.AspNet.Providers.Core1.0,我应该删除1.2包参考吗?
这一定是非常明显的,但对我来说这看起来很奇怪.我有简单的控制器,带有一个属性的模型,以及显示属性值的视图,并为该属性呈现编辑器.单击按钮时,表单将被发布,并且感叹号将附加到属性.此感叹号在我的视图中可见,但仅在p标记中可见,而不是在input呈现的标记中Html.TextBoxFor().
为什么Html.TextBoxFor()忽略我在后期操作中更新了我的模型?
有没有办法改变这种行为Html.TextBoxFor()?
视图
@model ModelChangeInPostActionNotVisible.Models.IndexModel
@using (Html.BeginForm())
{
<p>@Model.MyProperty</p>
@Html.TextBoxFor(m => m.MyProperty)
<input type="submit" />
}
Run Code Online (Sandbox Code Playgroud)
模型
namespace ModelChangeInPostActionNotVisible.Models
{
public class IndexModel
{
public string MyProperty { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
调节器
namespace ModelChangeInPostActionNotVisible.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new IndexModel { MyProperty = "hi" });
}
[HttpPost]
public ActionResult Index(IndexModel model)
{
model.MyProperty += "!";
return View(model);
}
} …Run Code Online (Sandbox Code Playgroud) 有这个:
procedure Foo;
begin
end;
function Bar: TProcedure;
begin
Result := Foo;
end;
Run Code Online (Sandbox Code Playgroud)
以下编译:
var
tmp: TProcedure;
begin
tmp := Bar();
tmp();
Run Code Online (Sandbox Code Playgroud)
...但以下内容不能在Delphi中编译:
Bar()();
Run Code Online (Sandbox Code Playgroud)
有这种"限制"的原因吗?Bar()();语法是否在Pascal的其他"风格"中编译?将Bar()();语法编译一些其他的方面?
为什么这个编译:
return default(T);
Run Code Online (Sandbox Code Playgroud)
但这不是:
return default((T));
Run Code Online (Sandbox Code Playgroud)
完整的方法是
public static T PenultimateOrDefault<T>(this IEnumerable<T> items)
{
if (items.Count() >= 2)
return items.ElementAt(items.Count() - 2);
else
return default(T);
}
Run Code Online (Sandbox Code Playgroud)
错误default((T))是
; expected
Invalid expression term ')'
Type expected
Run Code Online (Sandbox Code Playgroud)
所以看起来解析器被双括号所困扰.
该对象是用它创建的reify,我需要重写它的方法之一。我发现的唯一方法是使用经典的 OO 装饰器和reify. 还有其他办法吗?
我注意到ExecuteRegisteredAsyncTasks调用返回后的代码与该调用之前的代码在同一线程中执行。因此,我知道手动调用ExecuteRegisteredAsyncTasks不会释放请求处理线程来处理其他请求,并且应该仅自动调用此方法以获得扩展好处?
在msdn上是示例代码,但帮助无法回答此问题。
更新
就我而言,PageAsyncTasks我异步调用Web服务(使用Begin *和End *),所以我不使用线程池。
c# ×6
.net ×4
asp.net ×3
iis ×2
web-services ×2
asp.net-mvc ×1
clojure ×1
decorator ×1
delphi ×1
nuget ×1
pascal ×1
reify ×1
silverlight ×1
using ×1
xmlwriter ×1