所以我们都意识到不可变类型的好处,特别是在多线程场景中.(或者至少我们都应该意识到这一点;参见例如System.String.)
但是,我没有看到很多关于创建不可变实例的讨论,特别是设计指南.
例如,假设我们想要具有以下不可变类:
class ParagraphStyle {
public TextAlignment Alignment {get;}
public float FirstLineHeadIndent {get;}
// ...
}
Run Code Online (Sandbox Code Playgroud)
我见过的最常见的方法是拥有可变/不可变的"对"类型,例如可变的List <T>和不可变的ReadOnlyCollection <T>类型或可变的StringBuilder和不可变的String类型.
为了模仿这个现有的模式,需要引入某种类型的"可变" ParagraphStyle类型,它"复制"成员(提供setter),然后提供一个ParagraphStyle构造函数,接受可变类型作为参数
// Option 1:
class ParagraphStyleCreator {
public TextAlignment {get; set;}
public float FirstLineIndent {get; set;}
// ...
}
class ParagraphStyle {
// ... as before...
public ParagraphStyle (ParagraphStyleCreator value) {...}
}
// Usage:
var paragraphStyle = new ParagraphStyle (new ParagraphStyleCreator {
TextAlignment = ...,
FirstLineIndent …Run Code Online (Sandbox Code Playgroud) 在我的atexit()注册函数里面,我想得到退出状态(exit(3)的参数或者返回的main()).
有没有可行的方法这样做?是否有任何GNU libc特定的方式来实现它,例如全局持有我可以参考的值?
我想实现一个Window类似于IE的新版本如何在Vista/7 aero中添加URL栏的方式.我环顾四周,找不到太多有用的信息,并且想知道你们中是否有人知道最好的方法!
这是问题所在,
我有一个控制器:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Detail(SomeObjectX a)
{
SomeObjectY b = new SomeObjectY();
b.merge(a); //i already have merge method.
return RedirectToAction("SomeAction", "SomeController", new { c = b });
}
Run Code Online (Sandbox Code Playgroud)
是否可以将对象b传递给不同控制器上的其他操作,在本例中为SomeController上的SomeAction.谢谢你的帮助 :)
我正在尝试将一个对象添加到列表中,但由于我在尝试重置列表后添加了实际对象,因此列表中的所有值都将重置.是否有一种实际的方法可以将监视器对象添加到列表中并更改值,而不会影响我已在列表中保存的值?
谢谢
码:
arrayList = []
for x in allValues:
result = model(x)
arrayList.append(wM)
wM.reset()
Run Code Online (Sandbox Code Playgroud)
其中wM是一个监视器类 - 正在模型方法中计算/计算出来
我知道即使问这个问题,我也开始自己开火了,但我想我会看看StackOverflow是否有解决我遇到的问题的方法......
我有一个C#应用程序在客户端站点失败,我无法在本地重现.不幸的是,我很难(不可能)获得任何有助于隔离问题根源的信息.
我有一个相当广泛的错误监控框架,它在所有常见的地方监视未处理的异常:
在我可以访问它们的地方记录详细信息.
这在过去非常有用,可以识别生产代码中的问题,但是没有向我提供有关当前一系列问题的任何信息.
我最好的猜测是,核心问题是"粗鲁"异常类型之一(线程中止,内存不足,堆栈溢出,访问冲突等),这些异常类型正在逐步升级为严重关闭有机会看到发生了什么.
我可以对快照信息做些什么,因为我的进程崩溃会有用吗?理想情况下,我可以写出我的自定义日志格式,但如果我能有一种可靠的方法来确保在某处写入崩溃转储,我会很高兴.
我希望我可以实现从CriticalFinalizerObject派生的类,并在它处理时吐出最后机会错误注销,但这似乎并没有在我测试的StackOverflow场景中触发.
由于缺少代码签名证书,我无法使用Windows错误报告和朋友.
我不是试图从任意异常中"恢复",我只是想记下下去的路上出了什么问题.
有任何想法吗?
我想我在我的网络应用程序中发现了更多错误.通常,我不担心并发问题,但是当您收到ConcurrentModificationException时,您开始重新考虑您的设计.
我在Jetty上使用JBoss Seam和Hibernate以及EHCache.现在,它是一个具有多个核心的单个应用程序服务器.
我简要地查看了我的代码,发现了一些尚未抛出异常的地方,但我相信他们可以.
第一个servlet过滤器我基本上检查是否有消息通知用户后台发生的事件(来自作业或其他用户).过滤器只是在模式弹出窗口中向页面添加消息.消息存储在会话上下文中,因此可能另一个请求可以从会话上下文中提取相同的消息.
现在,它工作正常,但我没有遇到许多并发请求的页面.我想我可能需要编写一些JMeter测试来确保不会发生这种情况.
第二个servlet过滤器记录所有传入的请求以及会话.这让我知道客户端来自哪里,他们正在运行什么浏览器等等.我最近看到的问题是图像库页面(大约在同一时间有很多请求),我最终得到了并发修改异常,因为我正在向会话添加请求.
会话包含一个请求列表,该列表似乎被多个线程命中.
@Entity
public class HttpSession
{
protected List<HttpRequest> httpRequests;
@Fetch(FetchMode.SUBSELECT)
@OneToMany(mappedBy = "httpSession")
public List<HttpRequest> getHttpRequests()
{return(httpRequests);}
...
}
@Entity
public class HttpRequest
{
protected HttpSession httpSession;
@ManyToOne(optional = false)
@JoinColumn(nullable = false)
public HttpSession getHttpSession()
{return(httpSession);}
...
}
Run Code Online (Sandbox Code Playgroud)
在第二个servlet过滤器中,我正在做某种事情:
httpSession.getHttpRequests().add(httpRequest);
session.saveOrUpdate(httpSession);
Run Code Online (Sandbox Code Playgroud)
错误输出的部分是当我进行一些比较以查看从请求到请求的变化时:
for(HttpRequest httpRequest:httpSession.getHttpRequests())
Run Code Online (Sandbox Code Playgroud)
那条线出现了并发修改异常.
要走的路:1.JMeter测试在这里有用吗?2.您建议哪些书籍用于编写在并发加载下扩展的Web应用程序?3.我尝试在我认为需要它的地方放置同步,即在循环请求的方法上,但它仍然失败.我还需要做什么?
我添加了一些评论:
我曾考虑过将http请求记录为后台任务.我可以轻松生成后台任务来保存该信息.我想记住为什么我没有那么评价.我认为有一些信息我想当场访问.
如果我把它变成异步,这会大大加快吞吐量 - 我必须使用JMeter来衡量这些差异.
我仍然需要处理那里的并发问题.
谢谢,
沃尔特
这个问题是一个结构/设计问题,因为我无法找到执行任务的最佳方法.
在我的MVC应用程序中,我使用DotNetOpenAuth(3.4)作为我的登录信息提供者,只使用FormsAuthenticationcookie 的标准等.
DB中的当前用户表具有:
由于UserId是用户的明确标识符(他们应该能够在以后更改其OpenId提供程序),因此它是其他表链接到(对于用户)的关键.
这是当前代码,在成功身份验证时,会创建临时用户并重定向到"创建操作".
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);
var users = new UserRepository();
if (!users.IsOpenIdAssociated(response.ClaimedIdentifier))
{
var newUser = new DueDate.Models.User();
newUser.OpenIdIdentifer = response.ClaimedIdentifier;
newUser.OpenIdDisplay = response.FriendlyIdentifierForDisplay;
TempData["newUser"] = newUser;
return this.RedirectToAction("Create");
}
Run Code Online (Sandbox Code Playgroud)
现在问题的症结在于:
是否response.ClaimedIdentifier存储了针对用户的正确信息?
是FormAuthentication.SetAuthCookie表单身份验证的首选方法吗?或者,还有更好的方法?
当我调用SetAuthCookie时,除了用户之外没有与用户相关的数据ClaimedIdentifier.如果我一直提到他们UserId,创建用户是个更好的主意,那么将其存储UserId在cookie而不是ClaimedIdentifier?
如果我在很多地方使用UserId,我如何从cookie中检索它,或者将它存储在其他更合乎逻辑/有用的地方?
有点长的啰嗦,但我一直在努力找到最好的方法来做这个/
我有这个轮询脚本来检查是否在服务器上创建了一个文本文件.在本地工作很好,但当文件在不同的域上时失败.我如何重写这个跨域支持?
$.ajax({
url: 'http://blah.mydomain.com/test.txt',
type: "GET",
success: function(result) {
//Success!
window.location.replace(Successful.aspx');
},
error: function(request, status, error) {
setTimeout("VerifyStatus(" + pollingInterval + ")");
}
});
Run Code Online (Sandbox Code Playgroud)
编辑:我最终使用YQL来解决跨域问题,虽然它可行,但YQL实际上很慢,增加了相当多的性能开销.任何人都可以为跨域JQuery调用建议更好的解决方案吗?
我有一些数据存储在我想要处理的数据库中.数据库访问非常缓慢,因此我决定在进行任何处理之前将所有数据加载到字典中.但是,由于存储的数据量巨大,我得到了一个内存不足的错误(我看到使用了超过2个演出).所以我决定使用磁盘数据结构,并发现使用shelve是一种选择.这是我做的(伪python代码)
def loadData():
if (#dict exists on disk):
d = shelve.open(name)
return d
else:
d = shelve.open(name, writeback=True)
#access DB and write data to dict
# d[key] = value
# or for mutable values
# oldValue = d[key]
# newValue = f(oldValue)
# d[key] = newValue
d.close()
d = shelve.open(name, writeback=True)
return d
Run Code Online (Sandbox Code Playgroud)
我有一些问题,
1)我真的需要writeBack = True吗?它有什么作用?
2)我仍然得到一个OutofMemory异常,因为我没有对数据写入磁盘的时间进行任何控制.我怎么做?我尝试每隔几次迭代执行一次sync(),但这也无济于事.
谢谢!
c# ×3
asp.net ×2
python ×2
.net ×1
aero ×1
ajax ×1
asp.net-mvc ×1
c ×1
c#-4.0 ×1
concurrency ×1
cross-domain ×1
database ×1
dictionary ×1
immutability ×1
java ×1
javascript ×1
jquery ×1
object ×1
persistence ×1
seam ×1
shelve ×1
window ×1
wpf ×1