2012-04-25 58 views
1

我試圖做一些我認爲很容易的事情,但無法弄清楚如何寫入我的陳述函數中的標籤。從靜態函數寫入標籤

public static void StartProcessing(object data) 
{ 

    lblError.Text = "Blah Blah" 
} 

我得到錯誤「的對象引用需要非靜態字段,方法或屬性...」

所以,我試圖創建標籤的新實例,並將其添加到控制(面板),但lblError的新實例中,無法顯示

public static void StartProcessing(object data) 
    { 
     Panel Panel1 = new Panel(); 
     Label lblError= new Label(); 
     Panel1.Controls.Add(lblError); 

     lblError.Visible = true; 
     lblError.Text = "Blah Blah"; 

    } 

必須有一個簡單的方法來做到這一點?我忽略了...

該函數被調用如下:如果我改變上面的不是靜態的,我會在下面的第二行得到一個錯誤消息,說同一個「非對象引用是必需的靜態字段,方法或屬性...「當這個函數不是靜態的時候?

public object LaunchNewProcess(object data) 
{ 
ThreadPool.QueueUserWorkItem(
       new WaitCallback(ProcessStatuses.StartProcessing), 
       new object[] {newProcess, allProcesses} 
       ); 
+7

爲什麼你的方法是靜態的?這就是問題所在...... – 2012-04-25 20:12:33

+0

現在我明白你是如何調用你的函數的,你希望實現什麼? – SouthShoreAK 2012-04-25 20:30:02

+0

如果其中一個進程不成功,我只想向用戶顯示錯誤消息(我認爲是在標籤中)。 – user1186144 2012-04-25 20:31:28

回答

5

合格標籤,你的靜態功能,當你把它叫做:

public static void StartProcessing(object data, Label lblError) 
{ 

    lblError.Text = "Blah Blah" 
} 

靜態函數沒有訪問控制,因爲控制屬於頁面實例(類) 。

靜態意味着一個類的所有實例共享相同的函數或變量。所以,一個類的實例可以訪問一個靜態變量或函數。但是,由於靜態不能「知道」該類的任何實例,因此無法訪問實例的成員。事實上,一個靜態方法或變量甚至不需要該類的任何實例存在,所以它如何呢?

正如其他人所說的那樣,刪除函數中的static關鍵字也會起作用,但我假設您將其設爲靜態的原因。

編輯 好的,這是比較複雜的。

所以,你有一些類啓動了一堆線程,並且你想要它顯示給用戶,如果出了什麼問題?那麼,你現在的方法是有缺陷的,因爲你不能訪問沒有頁面實例的頁面控件。另外,我不確定這種方法如何適合頁面生命週期。

你的最好的方法(對不起,缺乏代碼,這將取決於你實現了很多)可能是這樣的:

//do this before you start spawning threads 
List<bool> successes = new List<bool>(); 

ThreadPool.QueueUserWorkItem(
      new WaitCallback(ProcessStatuses.StartProcessing), 
      new object[] {newProcess, allProcesses, successes} 
      ); 

//you MUST wait for all your threads to complete before proceeding! 
if(successes.Any(s => !s)) 
{ 
    //update your error label 
} 

public static void StartProcessing(object data, Label lblError) 
{ 
    var dataArray = (object[3]) data; 
    //if there is an error 
    dataArray[2] = false; 
} 
+0

該功能是從類文件(.cs)中調用的,該文件不是具有標籤的表單的一部分!所以不確定我能否以這種方式通過標籤? – user1186144 2012-04-25 20:22:02

+1

哦。這在幾個層面上是個問題。如果另一個類正在調用此函數,而沒有頁面實例,那麼您的標籤始終爲空。你可能想要發佈你的源代碼,因爲它聽起來像你可能已經轉錯了方向。 – SouthShoreAK 2012-04-25 20:24:48

+0

如果您等待異步任務在該莊園中完成,那麼用戶坐在一個空白屏幕上,直到完成所有工作。這違背了使任務異步的目的,你可能只是在現有的線程中串行地執行。請參閱我的答案 – Servy 2012-04-25 20:48:00

2

你想要做的實際上是相當困難的。

您希望創建頁面,啓動異步任務,將頁面發送給用戶,然後在異步作業完成後更新頁面上的內容。

問題在於,當異步任務完成時,頁面已經發送完畢,並且基於HTTP的工作方式,一旦你發送了你的響應,你就完成了;沒有更多與你的客戶溝通。如果您想更新它們,您需要等待客戶端發送另一個請求。

這意味着您需要擁有持續不斷地查詢服務器的JavaScript代碼,基本上問:「您完成了嗎?您還完成了嗎?您完成了嗎?」直到最終服務器說,「是的,這裏是顯示在頁面上的東西」。

幸運的是,您不需要從頭開始。 Here你會發現微軟的一個例子,它可以完成所有這些工作;你可以修改它以適應你的需求。另外值得一提的是,除了不重要的程序外,它還會消耗大量資源來持續輪詢服務器,所以請確保您確實需要這樣做。

選項2只是不啓動新線程中的其他任務,並在頁面返回給用戶之前連續執行代碼。他們會盯着一個空白的屏幕一段時間,但編程會更容易。如果任務真的是長時間運行的,那麼在這裏關注的一個縮小的時間就是超時。

+0

他也可以等待所有線程完成,然後再從服務器。好的解釋,但。 – SouthShoreAK 2012-04-25 20:47:36

+0

@SouthShoreAK當我評論你的回答時,如果你這樣做了,爲什麼還要開始另一個線程呢?儘管我將這個選項編輯到了這個答案中。 – Servy 2012-04-25 20:49:50

+0

@SouthShoreAK哦,並且當我堅持我的回答時,如果您等待任務,客戶端可能會超時。 – Servy 2012-04-25 20:51:48