0

以下のコードで私がやろうとしているのは、クライアントがサーバー上で wcf メソッドを呼び出し、成功を返し、現在の進行状況、つまり完了率でコールバックを提供できるようにすることです。クライアントは、たとえば 10% 後に切断でき、メソッドは続行されます。

ただし、以下のコードでは、「成功」行が返されると関数が終了します。リターンが必要な理由は、クライアントがサービスの重要な処理が完了したことを知るまでブロックするためです。

これは可能ですか?

namespace WCFService
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class WCFJobsLibrary : IWCFJobsLibrary
    {
        public String ChatToServer(string texttoServer) // send some text to the server
        {
            Logging.Write_To_Log_File("Entry", MethodBase.GetCurrentMethod().Name, "", "", "", 1);

            try
            {
                // Some extemely important prechecks .....
                //........
                return "success";

                // Dont care now if client disconnects but lets give them some updates as progress happens if they are still connected


                IMyContractCallBack callback = OperationContext.Current.GetCallbackChannel<IMyContractCallBack>();
                // Some processing .....
                callbackmethod("20% complete", callback);
                // Some processing .....
                callbackmethod("40% complete", callback);
                // Some processing .....
                callbackmethod("60% complete", callback);
                // Some processing .....
                callbackmethod("80% complete", callback);
                // Some processing .....
                callbackmethod("100% complete", callback);

            }
            catch (Exception ex)
            {
                return "error";
            }
        }

        public void callbackmethod(string text, IMyContractCallBack somecallback)
        {
            try
            {
                somecallback.callbacktoServer(text);
            }    
            catch (Exception)
            {

            }    
        }
    }
}
4

2 に答える 2

2

return関数に入ると、その行で停止します。そのリターンの後に置いたものは何も実行されません。実際、コンパイラは到達不能なコードについて警告しているはずです。

編集:

return を呼び出す前に、継続作業を実行して update 呼び出しを送信するスレッドを開始することをお勧めします。

public String ChatToServer(string texttoServer) // send some text to the server
        {

            try
            {
                Logging.Write_To_Log_File("Entry", MethodBase.GetCurrentMethod().Name, "", "", "", 1);
                // Some extemely important prechecks .....
                System.Threading.Thread thread = new System.Threading.Thread(DoWork);
                thread.Start();
                //........
                return "success";

                // Dont care now if client disconnects but lets give them some updates as progress happens if they are still connected

            }
            catch (Exception ex)
            {
                return "error";
            }
        }

        void DoWork()
        {
            IMyContractCallBack callback = OperationContext.Current.GetCallbackChannel<IMyContractCallBack>();
            // Some processing .....
            callbackmethod("20% complete", callback);
            // Some processing .....
            callbackmethod("40% complete", callback);
            // Some processing .....
            callbackmethod("60% complete", callback);
            // Some processing .....
            callbackmethod("80% complete", callback);
            // Some processing .....
            callbackmethod("100% complete", callback);

        }
于 2013-03-21T20:18:46.610 に答える
1

コールバックを非同期にすることができ、それらは起動し、メソッドは戻りますがreturn、コールバックが呼び出された後に行を配置する必要があります。

エラーが発生した場合、WCFには自動例外処理が組み込まれているためThrow、例外だけを返すことができ、それを返す必要はありません...クライアントでキャッチできます。そして、単なる「エラー」よりも多くの情報があります。

TPLの使用例:(System.Threading.Tasks名前空間、.net 4+を使用)

    string yourMethod() 
    {
        // Logging

        try 
        {   
            // prechecks 
        } 
        catch (Exception ex)
        {
            return "failed" // ok as you have now if no more information is needed
            // throw; // Can also throw exception which WCF client on other end can catch
        }     

        Task.Factory.StartNew(() => {
            IMyContractCallBack callback = OperationContext.Current.GetCallbackChannel<IMyContractCallBack>();
            // Some processing .....
            callbackmethod("20% complete", callback);
            // Some processing .....
            callbackmethod("40% complete", callback);
            // Some processing .....
            callbackmethod("60% complete", callback);
            // Some processing .....
            callbackmethod("80% complete", callback);
            // Some processing .....
            callbackmethod("100% complete", callback);
        });
        return "success";
   }
于 2013-03-21T20:22:14.433 に答える