Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
奇数WCF问题_Wcf_Asynchronous_Callback - Fatal编程技术网

奇数WCF问题

奇数WCF问题,wcf,asynchronous,callback,Wcf,Asynchronous,Callback,我有一个使用WCF的服务器客户端 服务器有一个客户端列表 为了检查超时情况,它每分钟向每个客户端发送一点数据(ping)。所有发送都是异步完成的-因此该行如下所示: for (int i = 0; i < MaxUsers; i++) { if (_clients[i] != null) { _clients[i].Client.BeginSendToClient("PING", new AsyncCallback(this.SendToClientCall

我有一个使用WCF的服务器客户端

服务器有一个客户端列表

为了检查超时情况,它每分钟向每个客户端发送一点数据(ping)。所有发送都是异步完成的-因此该行如下所示:

for (int i = 0; i < MaxUsers; i++)
{
    if (_clients[i] != null)
    {
        _clients[i].Client.BeginSendToClient("PING", new AsyncCallback(this.SendToClientCallback), _clients[i].Client);
void SendToClientCallback(IAsyncResult asyncResult)
{
    IClientAsync callback = null;
    try
    {
        callback = (IClientAsync)asyncResult.AsyncState;
        callback.EndSendToClient(asyncResult);
    }
    catch (TimeoutException e)
超时异常必须转换我们发送回的结果,以获取_client数组中客户端的索引。。。它是用我写的一种方法实现的:

int myClientIndex = GetClientIndexFromCallback(CurrentCallback);
在哪里

private int-GetClientIndexFromCallback(IClientAsync回调)
{
对于(int i=0;i
现在,如果我先连接,然后断开连接,这段代码可以正常工作。它发送PING,转到回调方法。它生成超时异常。它获取id号(0)并删除_client[0],一切正常

但是,如果我连续两次连接和断开连接,在第一次连接超时之前,只有一个连接(第二个连接,或_client[1])断开连接。另一个连接保持不变,并不断被发送PING。 回调方法一直在运行,并不断生成超时异常…但是当我调用我的方法获取它的id时,它找不到它。由于某种原因,
\u clients[I]。Client.Equals(callback)
没有返回true


这怎么可能?每个PING命令都会发送
\u客户端[0].Client
,但当我在方法中比较它时,它返回false。

似乎您从多个线程访问_客户端。列表不是线程安全的。这可以解释这种奇怪的行为。

只是好奇,但为什么您要从数组中的索引开始,发送WCF代理对象,然后在数组。在异步状态和您的问题消失后,在索引中发送似乎更简单、更节省。

如何为IClientAsync实现Equals

我也同意Slashene的观点,它可能与线程有关。异步回调将在不同的线程上进行。每个线程都在同一个数组上工作,其中一个线程可能正在从数组中“删除”一个元素,而另一个线程则在迭代过程中进行了一半


MaxUsers的值从何而来?这是连接的用户总数吗?

我使用的不是列表,只是一个数组。我不知道线程会如何影响它,多个线程通常可以访问彼此的对象而不会出现问题,而且我有一个锁,以确保不会发生线程不安全的活动。你说的是“删除\u客户端[0]”但是我们不能删除数组中的某些内容,这就是为什么我认为您使用了列表
private int GetClientIndexFromCallback(IClientAsync callback)
{

    for (int i = 0; i < MaxUsers; i++)
    {
        if (_clients[i] != null && _clients[i].Client.Equals(callback))
        {
            // found
            return i;