Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于windows8/rt的wpf-wfc回调死锁_C#_Wpf_Wcf_Callback_Deadlock - Fatal编程技术网

C# 基于windows8/rt的wpf-wfc回调死锁

C# 基于windows8/rt的wpf-wfc回调死锁,c#,wpf,wcf,callback,deadlock,C#,Wpf,Wcf,Callback,Deadlock,每当我尝试做任何动作时,我都会遇到僵局,但我不知道为什么。重画表更新服务器中注册的每个客户端的方法是我的回调。当一个玩家做了一个类似于抽牌的动作时,服务器会做出响应并将牌返回到玩家手中。在执行此操作时,他通知所有其他玩家有人执行了某个操作。因此,玩家将自动更新所有内容,而不仅仅是基于动作,调用异步方法。因此,还有其他对服务器的请求,我认为,这就是导致死锁的原因。由于该方法必须来自客户端,因此我想没有其他解决方法。通过网络搜索,我得到了如下结果: 我在那里发现了很多有用的代码,但我无法在Visu

每当我尝试做任何动作时,我都会遇到僵局,但我不知道为什么。重画表更新服务器中注册的每个客户端的方法是我的回调。当一个玩家做了一个类似于抽牌的动作时,服务器会做出响应并将牌返回到玩家手中。在执行此操作时,他通知所有其他玩家有人执行了某个操作。因此,玩家将自动更新所有内容,而不仅仅是基于动作,调用异步方法。因此,还有其他对服务器的请求,我认为,这就是导致死锁的原因。由于该方法必须来自客户端,因此我想没有其他解决方法。通过网络搜索,我得到了如下结果:

我在那里发现了很多有用的代码,但我无法在Visual Studio 2013中实现它们,因为我想要的应用程序基于Windows 8/RT。下面是代码:

我的服务器

//接口ICallbackContract
公共接口ICallbackContract
{
[运营合同(IsOneWay=true)]
void redrawTable();
}
//界面层
[ServiceContract(SessionMode=SessionMode.Required,
CallbackContract=typeof(ICallbackContract))]
公共接口层
{
[运营合同(IsInitiating=true,IsTerminating=false,IsOneWay=true)]
无效登录(字符串名称);
[运营合同(IsInitiating=false,IsTerminating=false)]
bool-drawCard();
[经营合同]
卡片返回DrawnCard();
[经营合同]
无效掷牌(掷牌);
[经营合同]
卡片返回卡片(卡片移除);
[经营合同]
卡片getTopCardOfDeck();
[经营合同]
字典电子贺卡();
[经营合同]
列出getRestDeck();
[经营合同]
列出getThrownStack();
}
//职业选手
命名空间CardGameServer
{
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession,
ConcurrencyMode=ConcurrencyMode.Reentrant,UseSynchronizationContext=true)]
[CallbackBehavior(UseSynchronizationContext=false)]
公共密封类玩家:IPlayer
{
公共字符串名称{get;set;}
public static List callBackList=new List();
公共无效登录(字符串名称)
{
this.Name=Name;
ICallbackContract回调=
OperationContext.Current.GetCallbackChannel();
如果(!callBackList.Contains(callback))
{
callBackList.Add(回调);
}
ForEach(委托(ICallbackContract播放器){callback.redrawTable();});
}
公共卡回收卡()
{
//做点什么。。。
foreach(callBackList中的ICallbackContract回调)
{
callback.redrawTable();
}
返回true;
}
}
捕获(异常)
{
投掷;
}
返回false;
}
我的客户

namespace Cardgame.Client
{
公开密封部分类游戏页面:第页,IPlayerCallback
{
实例语境;
EndpointAddress=新的EndpointAddress(loginPage.serverAddresse);
NetTcpBinding=新的NetTcpBinding(SecurityMode.None);
双工厂;
IPlayer-myClient;
ObservableCollection Hand=新的ObservableCollection();
抛出的ObservableCollection=新的ObservableCollection();
ObservableCollection甲板=新的ObservableCollection();
可观测的收集甲板;
公共游戏网页()
{
this.InitializeComponent();
上下文=新的InstanceContext(此);
工厂=新的DuplexChannelFactory(上下文、绑定、地址);
myClient=factory.CreateChannel();
登录();
throwable.ItemsSource=抛出;
lstCards.ItemsSource=手;
EnemyStcards.ItemsSource=enemyDeck;
}
私有异步void登录()
{
等待myClient.loginAsync(loginPage.username);
}
私有异步无效提款卡(对象发送器,TappedRoutedEventArgs e)
{
Add(等待myClient.returnDrawnCardAsync());
}
公共异步void重绘表()
{
//更新restOfDeck
.....
Deck=wait myClient.getRestDeckAsync();
//更新thrownStack
.....
抛出=等待myClient.getThrownStackAsync();
//更新文本
//更新enemyHand
.....
dictionary myEnemy=wait myClient.enemyCardsAsync();
}

Linh2502,看到您正在使用WCF并实现发布/订阅模型,我建议您在此处查看Juval Lowy的iDesign发布-订阅框架:

我相信您会特别希望使用通过ISubscriptionService接口管理的临时订阅(内存中)

我相信这将有助于解决您遇到的并发问题


Paul

单击pause并在死锁期间检查每个线程的调用堆栈。