我讀/從會話在不同的線程在單個請求編寫對象是這樣的:從pro-pro會話中讀取/寫入對象是否是原子操作?
public class HomeController : Controller
{
public int Index()
{
Task.WaitAll(DoStuff(), DoMoreStuff());
var foo = Session["foo"] as Foo;
return foo.MyProperty;
}
public Task DoStuff()
{
return Task.Factory.StartNew(() =>
{
var foo = Session["foo"] as Foo;
if (foo == null || foo.MyProperty == 1)
foo = new Foo { MyProperty = 1 };
Session["foo"] = foo;
});
}
public Task DoMoreStuff()
{
return Task.Factory.StartNew(() =>
{
var foo = Session["foo"] as Foo;
if (foo == null || foo.MyProperty == 1)
foo = new Foo { MyProperty = 2 };
Session["foo"] = foo;
});
}
}
public class Foo
{
public int MyProperty { get; set; }
}
現在,在這個代碼的邏輯顯然是沒有意義的,但我提供它來顯示什麼樣的操作我做:
- 閱讀對象的引用,
- 寫作對象的引用,
- 創建新的對象,
- 閱讀OBJ等領域。
我沒有修改現有的對象。一般來說,這段代碼是否會損壞會話狀態或內存?
這是具有默認進程內會話實現的ASP.NET MVC應用程序。
如果此代碼可能損壞會話狀態,每次我在此代碼中訪問會話時,是否應鎖定Session.SyncRoot
?