2013-09-23 37 views
-4

我需要一個進程,每秒檢查一次來自數據庫的值是否爲true,通過windows服務將其設置爲true。每秒鐘檢查數據庫值,同時允許用戶做其他事情

當值爲true時更新圖像。 但我需要,而價值是假的,用戶可以自由地在頁面上做其他活動。

我一直在尋找多線程通信,但我真的沒有找到我需要的東西。

感謝您的幫助

在這裏,我將我的代碼有:

private static class QuickUpdateCompletedCheck 
{ 
    #region BEGIN Declares 

    private static ProcessStatus quickUpdateCompletedStatus; 
    private static Thread quickUpdateThread; 
    private static ISynchronizeInvoke quickUpdateCompletedSynch; 
    private static bool updateCompleted; 
    private static QuickUpdateInfo quickUpdateInfo = null; 

    public delegate void UpdateCompletedStatusCheck(string Message, int status); 

    #endregion END Declares 
    #region BEGIN Initialization 

    public QuickUpdateCompletedCheck(ISynchronizeInvoke syn, ProcessStatus notify, Guid userIdLoc, int activityIdLoc, int fileIdLoc, int spreadIdLoc) 
    { 
     quickUpdateCompletedSynch = syn; 
     quickUpdateCompletedStatus = notify; 
     quickUpdateInfo = new QuickUpdateInfo(activityIdLoc, fileIdLoc, spreadIdLoc, userIdLoc); 
    } 

    #endregion END Initialization 
    #region BEGIN Methods 

    public void StartProcess() 
    { 
     quickUpdateThread = new System.Threading.Thread(new ParameterizedThreadStart(UpdateStatus)); 
     //set the thread to run in the background 
     quickUpdateThread.IsBackground = true; 
     //name our thread (optional) 
     quickUpdateThread.Name = "Add List Items Thread"; 
     //start our thread 
     quickUpdateThread.Start(); 
    } 

    private static void UpdateStatus(object data) 
    { 
     QuickUpdateInfo quickUpdateInfo = (QuickUpdateInfo)data; 

     object[] dataInfo = new object[4]; 

     dataInfo[0] = quickUpdateInfo.ActivityId; 
     dataInfo[1] = quickUpdateInfo.FileId; 
     dataInfo[2] = quickUpdateInfo.SpreadId; 
     dataInfo[3] = quickUpdateInfo.UserId; 

     quickUpdateCompletedSynch.Invoke(QuickUpdateCompletedataInfo); //Here I have an error need a delegate method in first parameter. i suppose is the QuickUpdateComplete method at the end of this description 
    } 

    #endregion END Methods 
} 

public class QuickUpdateInfo 
{ 
    private int activityId; 
    private int fileId; 
    private int spreadId; 
    private Guid userId; 

    public int ActivityId 
    { 
     get { return activityId; } 
    } 

    public int FileId 
    { 
     get { return fileId; } 
    } 

    public int SpreadId 
    { 
     get { return spreadId; } 
    } 

    public Guid UserId 
    { 
     get { return userId; } 
    } 

    public QuickUpdateInfo(int activityId, int fileId, int spreadId, Guid userId) 
    { 
     this.activityId = activityId; 
     this.fileId = fileId; 
     this.spreadId = spreadId; 
     this.userId = userId; 
    } 
} 

這種方法是在頁面的圖像最被更新

public partial class SpreadCorrection : BasePage 
{ 
     protected void UpdatePostBack_OnClick(object sender, EventArgs e) 
    { 
       //how to start Thread here 
    } 

    private static void QuickUpdateComplete(int activityId, int fileId, int spreadId) 
    { 
     if (value from database is true) 
     { 
        UpdateImage(); 
        //how to stop Thread here 
     } 
    } 
} 
+0

*爲什麼*不能爲你多線程工作? –

+1

你真的認爲你是第一個遇到這種問題的人,在互聯網上什麼都沒有?我將這個問題解釋爲:*我懶得閱讀所有這些東西,發佈一個工作解決方案* – I4V

+0

好的多線程我的東西是answear,但我已經嘗試了幾個例子。無論如何感謝您的評論。 – crendon

回答

2

您可以使用JavaScript的setInterval()函數和jQuery的.ajax()函數調用服務器端的服務來檢查值,如下所示:

function checkForDatabaseValue() { 
    $.ajax({ 
     type: "POST", 
     url: "YourPage.aspx/GetDatabaseValue", 
     contentType: "application/json; charset=utf-8", 
     data: "{}", 
     dataType: "json", 
     success: function (data) { 
      // Do something with data returned here 
     }, 
     error: function (errorMessage) { 
      // Do something with error message here 
     }, 
     complete: function() { 
      // Reset the timer to a minute here 
      setTimeout(function() { 
       checkForDatabaseValue(); 
      }, 60000); 
     } 
    }); 
} 

YourPage.aspx可以承載一個ASP.NET AJAX頁面方法做簡單的網頁託管服務,自動編碼爲JSON數據,就像這樣:

[WebMethod] 
public static string GetDatabaseValue() 
{ 
    // Put database retrieval logic here 
} 

注意:您需要將ASP的參考。 NET AJAX庫使用頁面方法。上述setInterval.ajax()調用也可以與ASP.NET XML Web服務(.asmx)和WCF服務一起使用,但是由於其簡單性,我展示了ASP.NET AJAX Page Method方法。

+0

謝謝你解答我的問題 – crendon

1

在ASP.Net中運行後臺線程有多種方式。

這裏是ASP.Net一個簡單的例子 - Easy Background Tasks in ASP.NET

它會通過使用緩存調用你的代碼在指定的時間間隔(目前爲30秒)。

void Application_Start(object sender, EventArgs e) 
{ 
    AddTask("DoStuff", 30); // 30 seconds 
} 

private static CacheItemRemovedCallback OnCacheRemove; 

private void AddTask(string name, int seconds) 
{ 
    OnCacheRemove = CacheItemRemoved; 

    HttpRuntime.Cache.Insert(name, seconds, null, 
     DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, 
     CacheItemPriority.NotRemovable, OnCacheRemove); 
} 

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r) 
{ 
    // Checks if a value from database is true. 
    // If so, call to your method here ... 

    AddTask(k, Convert.ToInt32(v)); 
} 
+0

謝謝你的回答。這是我第一次使用線程。我已經將問題添加到了該問題中,以便您瞭解我是否在阻礙或者我做得不好。再次感謝 – crendon

相關問題