C# 向客户端返回值,然后返回一些回调

C# 向客户端返回值,然后返回一些回调,c#,wcf,wcf-binding,C#,Wcf,Wcf Binding,在下面的代码中,我试图做的是允许我的客户机在服务器上调用wcf方法,返回success,然后对当前进度(即完成百分比)进行回调。客户端可以在10%之后断开连接,该方法将继续 但在下面的代码中,返回“success”行会导致函数退出。我想要返回的原因是,客户机会阻塞,直到他知道服务完成了一些重要的处理 这可能吗 namespace WCFService { [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)

在下面的代码中,我试图做的是允许我的客户机在服务器上调用wcf方法,返回success,然后对当前进度(即完成百分比)进行回调。客户端可以在10%之后断开连接,该方法将继续

但在下面的代码中,返回“success”行会导致函数退出。我想要返回的原因是,客户机会阻塞,直到他知道服务完成了一些重要的处理

这可能吗

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)
            {

            }    
        }
    }
}
名称空间WCFService
{
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
公共类WCFJobsLibrary:IWCFJobsLibrary
{
publicstringchattoserver(stringtexttoserver)//向服务器发送一些文本
{
Logging.Write到日志文件(“Entry”,MethodBase.GetCurrentMethod().Name,”,“”,1);
尝试
{
//一些非常重要的预检。。。。。
//........
返回“成功”;
//现在不关心客户端是否断开连接,但如果它们仍然连接,让我们在进展过程中为它们提供一些更新
IMyContractCallBack callback=OperationContext.Current.GetCallbackChannel();
//一些加工。。。。。
回调方法(“20%完成”,回调);
//一些加工。。。。。
回调方法(“40%完成”,回调);
//一些加工。。。。。
回调方法(“60%完成”,回调);
//一些加工。。。。。
回调方法(“80%完成”,回调);
//一些加工。。。。。
回调方法(“100%完成”,回调);
}
捕获(例外情况除外)
{
返回“错误”;
}
}
public void callbackmethod(字符串文本,IMyContractCallBack somecallback)
{
尝试
{
callbacktoServer(文本);
}    
捕获(例外)
{
}    
}
}
}

当您在函数中返回时,它将在该行停止。您在返回后放置的任何内容都不会执行。事实上,您的编译器应该警告您不可访问的代码

编辑:

我建议在调用return之前启动一个线程,该线程将运行continue工作并发送更新调用

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);

        }
publicstringchattoserver(stringtexttoserver)//向服务器发送一些文本
{
尝试
{
Logging.Write到日志文件(“Entry”,MethodBase.GetCurrentMethod().Name,”,“”,1);
//一些非常重要的预检。。。。。
System.Threading.Thread Thread=新的System.Threading.Thread(道工);
thread.Start();
//........
返回“成功”;
//现在不关心客户端是否断开连接,但如果它们仍然连接,让我们在进展过程中为它们提供一些更新
}
捕获(例外情况除外)
{
返回“错误”;
}
}
无效销钉()
{
IMyContractCallBack callback=OperationContext.Current.GetCallbackChannel();
//一些加工。。。。。
回调方法(“20%完成”,回调);
//一些加工。。。。。
回调方法(“40%完成”,回调);
//一些加工。。。。。
回调方法(“60%完成”,回调);
//一些加工。。。。。
回调方法(“80%完成”,回调);
//一些加工。。。。。
回调方法(“100%完成”,回调);
}

当您在函数中返回时,它将在该行停止。您在返回后放置的任何内容都不会执行。事实上,您的编译器应该警告您不可访问的代码

编辑:

我建议在调用return之前启动一个线程,该线程将运行continue工作并发送更新调用

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);

        }
publicstringchattoserver(stringtexttoserver)//向服务器发送一些文本
{
尝试
{
Logging.Write到日志文件(“Entry”,MethodBase.GetCurrentMethod().Name,”,“”,1);
//一些非常重要的预检。。。。。
System.Threading.Thread Thread=新的System.Threading.Thread(道工);
thread.Start();
//........
返回“成功”;
//现在不关心客户端是否断开连接,但如果它们仍然连接,让我们在进展过程中为它们提供一些更新
}
捕获(例外情况除外)
{
返回“错误”;
}
}
无效销钉()
{
IMyContractCallBack callback=OperationContext.Current.GetCallbackChannel();
//一些加工。。。。。
回调方法(“20%完成”,回调);
//一些加工。。。。。
回调方法(“40%完成”,回调);
//一些加工。。。。。
回调方法(“60%完成”,回调);
//一些加工。。。。。
回调方法(“80%完成”,回调);
//一些加工。。。。。
回调方法(“100%完成”,回调);
}

您可以使回调异步,它们将启动,方法将返回,但您必须在调用回调后放置
返回

在发生错误的情况下,WCF内置了自动异常处理功能,因此您只需
抛出
异常,无需返回它。。。然后可以在客户端捕获它。而且会有更多的信息,而不仅仅是“错误”

使用TPL的示例:(使用
System.Threading.Tasks
namespace.net4+)

stringyourmeth