关于【对象“***.rem”已经断开连接或不在服务器上】异常的解决方法

     假设,Remoting服务端接受并保存了一个Remoting客户端注册的回调接口(比如ICallback),在一定的时刻,服务端会通过ICallback接口调用客户端的某些方法。当运行一段时间后,服务端再次回调ICallback时,就抛出了类似下面的异常:
       对象“/9ca38d87_7f53_49b7_8c81_f2d499239f27/jqgpmhyy_rwcmicplf3j8s0j_1.rem”已经断开连接或不在服务器上。
      
原因在于回调接口指向的服务对象已经被释放,解决方案很简单,只要设置服务对象的生命周期就可以了:                  
    public   class   Callback  MarshalByRefObject ICallback
    {
        
public override object  InitializeLifetimeService()
        {
            
//Remoting对象 无限生存期

             return  null;
    
    }
    }
      如此可以保证客户端的Callback对象在应用程序的整个生命周期内都是激活的状态,服务端可以随时回调它。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用 qbasic 编写俄罗斯方块 640*240 黑白并生成 .bas 文件的示例代码: ``` REM 俄罗斯方块游戏 REM 作者:AI智能编程 SCREEN 12, 0, 1 ' 640*240, 黑白模式 RANDOMIZE TIMER ' 初始化随机数生成器 ' 定义常量 CONST ROWS = 20 ' 行数 CONST COLS = 10 ' 列数 CONST BLOCK_SIZE = 12 ' 方块大小 CONST BLOCK_NUM = 7 ' 方块种类数 ' 定义方块的形状 DIM SHARED BLOCKS(7, 4, 4) BLOCKS(1) = _ ' O 形 "1111" + _ "1001" + _ "1001" + _ "1111" BLOCKS(2) = _ ' I 形 "1000" + _ "1000" + _ "1000" + _ "1000" BLOCKS(3) = _ ' T 形 "1110" + _ "0100" + _ "0100" + _ "0000" BLOCKS(4) = _ ' L 形 "1000" + _ "1000" + _ "1100" + _ "0000" BLOCKS(5) = _ ' J 形 "0010" + _ "0010" + _ "0110" + _ "0000" BLOCKS(6) = _ ' S 形 "0010" + _ "0110" + _ "0100" + _ "0000" BLOCKS(7) = _ ' Z 形 "0100" + _ "0110" + _ "0010" + _ "0000" ' 定义变量 DIM SHARED ROWS(ROWS, COLS) AS INTEGER ' 存储方块图形 DIM SHARED BLOCK_X AS INTEGER ' 方块坐标 X DIM SHARED BLOCK_Y AS INTEGER ' 方块坐标 Y DIM SHARED BLOCK_TYPE AS INTEGER ' 方块类型 DIM SHARED BLOCK_ROTATE AS INTEGER ' 方块旋转次数 DIM SHARED SCORE AS INTEGER ' 分数 ' 初始化游戏 SUB INIT_GAME () DIM SHARED I AS INTEGER DIM SHARED J AS INTEGER FOR I = 0 TO ROWS - 1 FOR J = 0 TO COLS - 1 ROWS(I, J) = 0 ' 初始化为 0 NEXT J NEXT I BLOCK_X = INT((COLS - 4) / 2) * BLOCK_SIZE ' 初始坐标 BLOCK_Y = 0 BLOCK_TYPE = INT(RND * BLOCK_NUM) + 1 ' 随机方块类型 BLOCK_ROTATE = INT(RND * 4) ' 随机方块旋转次数 SCORE = 0 END SUB ' 绘制方块 SUB DRAW_BLOCK (X AS INTEGER, Y AS INTEGER, TYPE AS INTEGER, ROTATE AS INTEGER) DIM SHARED I AS INTEGER DIM SHARED J AS INTEGER DIM SHARED K AS INTEGER DIM SHARED L AS INTEGER DIM SHARED BLOCK_SHAPE AS STRING BLOCK_SHAPE = BLOCKS(TYPE, ROTATE + 1) FOR I = 0 TO 3 FOR J = 0 TO 3 K = X + J * BLOCK_SIZE L = Y + I * BLOCK_SIZE IF MID(BLOCK_SHAPE, I * 4 + J + 1, 1) = "1" THEN LINE (K, L)-(K + BLOCK_SIZE, L + BLOCK_SIZE), 1, BF ' 画方块 END IF NEXT J NEXT I END SUB ' 检查方块是否可以移动或旋转 FUNCTION CHECK_BLOCK (X AS INTEGER, Y AS INTEGER, TYPE AS INTEGER, ROTATE AS INTEGER) AS INTEGER DIM SHARED I AS INTEGER DIM SHARED J AS INTEGER DIM SHARED K AS INTEGER DIM SHARED L AS INTEGER DIM SHARED BLOCK_SHAPE AS STRING BLOCK_SHAPE = BLOCKS(TYPE, ROTATE + 1) FOR I = 0 TO 3 FOR J = 0 TO 3 K = X + J L = Y + I IF MID(BLOCK_SHAPE, I * 4 + J + 1, 1) = "1" THEN IF K < 0 OR K >= COLS OR L >= ROWS OR (L >= 0 AND ROWS(L, K) <> 0) THEN RETURN 0 ' 不可移动或旋转 END IF END IF NEXT J NEXT I RETURN 1 ' 可以移动或旋转 END FUNCTION ' 移动方块 SUB MOVE_BLOCK (X AS INTEGER, Y AS INTEGER, TYPE AS INTEGER, ROTATE AS INTEGER) DIM SHARED I AS INTEGER DIM SHARED J AS INTEGER DIM SHARED K AS INTEGER DIM SHARED L AS INTEGER DIM SHARED BLOCK_SHAPE AS STRING BLOCK_SHAPE = BLOCKS(TYPE, ROTATE + 1) FOR I = 0 TO 3 FOR J = 0 TO 3 K = X + J L = Y + I IF MID(BLOCK_SHAPE, I * 4 + J + 1, 1) = "1" THEN ROWS(L, K) = TYPE ' 更新方块图形 END IF NEXT J NEXT I END SUB ' 消除满行 SUB REMOVE_LINES () DIM SHARED I AS INTEGER DIM SHARED J AS INTEGER DIM SHARED FULL_ROWS AS INTEGER FOR I = ROWS - 1 TO 0 STEP -1 FULL_ROWS = 1 FOR J = 0 TO COLS - 1 IF ROWS(I, J) = 0 THEN FULL_ROWS = 0 EXIT FOR END IF NEXT J IF FULL_ROWS = 1 THEN FOR J = 0 TO COLS - 1 ROWS(I, J) = 0 ' 清空满行 NEXT J FOR J = I - 1 TO 0 STEP -1 FOR K = 0 TO COLS - 1 ROWS(J + 1, K) = ROWS(J, K) ' 上面的方块下落 NEXT K NEXT J SCORE = SCORE + 10 ' 增加分数 END IF NEXT I END SUB ' 绘制游戏界面 SUB DRAW_GAME () DIM SHARED I AS INTEGER DIM SHARED J AS INTEGER CLS FOR I = 0 TO ROWS - 1 FOR J = 0 TO COLS - 1 IF ROWS(I, J) <> 0 THEN LINE (J * BLOCK_SIZE, I * BLOCK_SIZE)-(J * BLOCK_SIZE + BLOCK_SIZE, I * BLOCK_SIZE + BLOCK_SIZE), 1, BF ' 画方块 END IF NEXT J NEXT I DRAW_BLOCK BLOCK_X, BLOCK_Y, BLOCK_TYPE, BLOCK_ROTATE ' 绘制当前方块 PRINT "SCORE: "; SCORE ' 显示分数 END SUB ' 主程序 SUB MAIN () DIM SHARED MOVE_TIME AS SINGLE DIM SHARED KEY_STATE AS STRING * 256 DIM SHARED GAME_OVER AS INTEGER DIM SHARED I AS INTEGER DIM SHARED J AS INTEGER DIM SHARED K AS INTEGER INIT_GAME ' 初始化游戏 DO WHILE NOT GAME_OVER DRAW_GAME ' 绘制游戏界面 IF MOVE_TIME < TIMER THEN ' 方块下落 MOVE_TIME = TIMER + 0.3 ' 下落时间间隔 IF CHECK_BLOCK(BLOCK_X, BLOCK_Y + BLOCK_SIZE, BLOCK_TYPE, BLOCK_ROTATE) THEN BLOCK_Y = BLOCK_Y + BLOCK_SIZE ' 方块下落 ELSE MOVE_BLOCK BLOCK_X, BLOCK_Y, BLOCK_TYPE, BLOCK_ROTATE ' 更新方块图形 REMOVE_LINES ' 消除满行 BLOCK_X = INT((COLS - 4) / 2) * BLOCK_SIZE ' 新的方块 BLOCK_Y = 0 BLOCK_TYPE = INT(RND * BLOCK_NUM) + 1 BLOCK_ROTATE = INT(RND * 4) IF NOT CHECK_BLOCK(BLOCK_X, BLOCK_Y, BLOCK_TYPE, BLOCK_ROTATE) THEN ' 游戏结束 GAME_OVER = 1 END IF END IF END IF FOR I = 1 TO 255 ' 检测按键 KEY_STATE(I) = CHR$(INP(&H60 + I)) NEXT I IF KEY_STATE(28) <> CHR$(0) AND CHECK_BLOCK(BLOCK_X, BLOCK_Y + BLOCK_SIZE, BLOCK_TYPE, BLOCK_ROTATE) THEN ' 按下 Enter 键方块加速下落 BLOCK_Y = BLOCK_Y + BLOCK_SIZE END IF IF KEY_STATE(75) <> CHR$(0) AND CHECK_BLOCK(BLOCK_X - BLOCK_SIZE, BLOCK_Y, BLOCK_TYPE, BLOCK_ROTATE) THEN ' 按下左箭头移动方块 BLOCK_X = BLOCK_X - BLOCK_SIZE END IF IF KEY_STATE(77) <> CHR$(0) AND CHECK_BLOCK(BLOCK_X + BLOCK_SIZE, BLOCK_Y, BLOCK_TYPE, BLOCK_ROTATE) THEN ' 按下右箭头移动方块 BLOCK_X = BLOCK_X + BLOCK_SIZE END IF IF KEY_STATE(72) <> CHR$(0) AND CHECK_BLOCK(BLOCK_X, BLOCK_Y, BLOCK_TYPE, (BLOCK_ROTATE + 1) MOD 4) THEN ' 按下上箭头旋转方块 BLOCK_ROTATE = (BLOCK_ROTATE + 1) MOD 4 END IF LOOP DRAW_GAME ' 绘制最终游戏界面 PRINT "GAME OVER" PRINT "SCORE: "; SCORE DO WHILE INKEY$ <> "" ' 等待按键 LOOP END SUB MAIN ' 运行游戏 ``` 将以上代码保存为 tetris.bas 文件,即可在 qbasic 中运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值