2009-02-08 125 views
2

我想知道如何使用MarshalByRef對象在服務器端處理線程。.NET遠程處理線程模型

鑑於我遠程的MarshalByRef類:

public class MyRemotedClass : MarshalByRef 
{ 
    public int MyInt; 
    public string MyString; 
} 

客戶端代碼(單線程):

MyRemotedClass m = GetSomehowMyRemotedClass(); 
m.MyInt = 5; // Write operation 1 
m.MyString = "Hello World"; // Write operation 2 

在服務器端,我們有兩個寫操作。我假設該線程來自ThreadPool。但是,由於類是MarshalByRef,因此兩個操作都是單獨的遠程過程調用。他們將在單獨的線程上運行嗎?如果是,在操作1結束之前是否會執行操作2?

PS:製作MyRemotedClass MarshalByRef是個壞決定。但我不能改變這一點,所以請不要提出這個建議。

回答

2

我不是這方面的專家,但我真的希望MyInt已經可靠地完成之前的客戶端事件試圖寫入MyString除非你有一些時髦的異步行爲回事。

畢竟,如果分配失敗,出於某種原因,唯一合理的處理方式是在繼續之前拋出異常,IMO。

2

事實上,據我會想想,設置2個屬性是不會發生異步,所以客戶端等待,直到前,將與RPC開始第一次RPC完成2

無論如何,如果您的MyRemotedClass未配置爲單個服務器激活的對象,請記住,對於您在MyRemotedClass上執行的每個RPC,都將在服務器上創建一個新實例。這意味着遠程對象不應該包含任何狀態。

+0

我不*認爲*它會創建一個新的實例,如果它是MarshalByRefObject。根據我的理解,MBRO的重點在於只有一個引用被編組,並且該對象本身「生活在」服務器上。 – 2009-02-08 09:36:58