C#如何在WCF应用程序的业务逻辑类中的两个方法之间实现标志消息传递系统

本文关键字:方法 两个 之间 系统 消息传递 标志 实现 WCF 应用程序 业务 | 更新日期: 2023-09-27 18:28:44

我在C#业务逻辑类中有两个方法。我需要一个标志机制,这样一个方法可以更新标志,另一个方法将在标志更新时做出反应。下面我将粘贴我的情况,这很简单:

// BusinessLogic.cs
bool photoResizingFinished = false;
public int SavePhoto() {
while (!photoResizingFinished)  {
    System.Threading.Thread.Sleep(100);
        Trace.TraceInformation("PhotoResizingWorkerRole has not finnished yet.");
     } }
public bool UpdateStatus(bool statusUpdate) {
   photoResizingFinished = statusUpdate;
   return true; 
}

上面的两个方法位于同一个类BusinessLogic.cs.中

我唯一需要的就是能够让SavePhoto()在CCD_ 2由CCD_ 3 更新

C#如何在WCF应用程序的业务逻辑类中的两个方法之间实现标志消息传递系统

您可以将该类用作Web服务,并实现在ws完成工作时调用的回调函数。示例代码:

    <script>
      var timerID = setTimeout(CallWS, 1000)//call a js func which calls the WevService
      function CallWS()
        {
           clearTimeout(timerID)//to stop the calling...
           WSClassName.WSFuncName(param1,param2,....,callBackSuccess,callBackFailur)
          ///the param1,param2 are according to the parameter the function is expected to get.
        }
     function callBackSuccess(result,eventArgs)
     {
         //When the WS function finished successfuly 
        //**set flag to true.**
     }
     function callBackFailur(result,eventArgs)
     {
       //when error occured in the WS function
        alert(result.get_message()).
     }
    </script>

如果你需要更多帮助,请告诉我。。。祝你好运!

您可以尝试使用.Net 4中的Task类。它允许您对任务进行排队,因此SavePhoto()代码将等待PhotoResizing()方法完成。

如果你想了解更多细节,这里有一篇关于Task命名空间的好文章:http://www.codethinked.com/net-40-and-systemthreadingtasks

using System.Threading.Tasks;
public void SavePhoto(CancellationTokenSource taskCancellationTokenSource){
   // preliminary code
   // start resize
   Task resizeTask =  Task.Factory.StartNew( ResizePhoto, taskCancellationTokenSource ) ;
   // queue up final save method
   Task finalTask = resizeTask.ContinueWith(t => {
     if (!t.IsFaulted && !t.IsCancelled){
         FinishSaving();
     }
   });
   // Wait for everything to finish
   finalTask.Wait(taskCancellationTokenSource);
}
public void ResizePhoto(){
  // code
}
public void FinishSaving(){
   // code
}

我会这样更改布尔:

bool _photoResizingFinished=false;
bool photoResizingFinished
{
    get{return _photoResizingFinished;}
    set
    {
     if(value) SavePhoto();            
     _photoResizingFinished=value;
    }
}

或者,您可以在更新bool后使UpdatePhoto()调用SavePhoto(。可能是一个更好的解决方案。

也许我已经找到了使用多线程Singleton 解决问题的方法

http://msdn.microsoft.com/en-us/library/ff650316.aspx

以下是一些实现尝试:

http://forums.asp.net/t/1783765.aspx/2/10?How+to+have+two+methods+of+the+same+class+flag+to+eacher+

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/abd53523-658b-442a-bac0-1c74c1d90a90

我自己也不完全理解这其中的奥秘,但我希望它没事。