如何为ObexListener对象设置超时时间?

3
我在使用obexListener对象时遇到了问题,当执行以下代码行时:
ObexListenerContext context = obexListener.GetContext();
它会等待通过蓝牙发送的文件,程序直到接收到文件才会响应。但是如果没有文件发送呢?那么它会无限期地等待,我无法停止程序。
如何实现等待时间,如果在该时间内未接收到任何内容,则取消操作?
以下是完整代码:谢谢。
private void codigo(object sender, BluetoothWin32AuthenticationEventArgs e)
        {
            if (!obexListener.Authenticate)
            {
                switch (MessageBox.Show("Desea vincular el dispositivo: " + e.Device.DeviceName.ToString(), "Atención", MessageBoxButtons.YesNo))
                //switch (MessageBox.Show("PIN CODE" + e.NumberOrPasskeyAsString, "EMPAREJAMINETO", MessageBoxButtons.YesNo))
                {
                    case DialogResult.Yes:
                        e.Confirm = true;
                        break;
                    case DialogResult.No:
                        e.Confirm = false;
                        break;
                }
            }
            else
            {
                switch (MessageBox.Show("Desea vincular el dispositivo: " + e.Device.DeviceName.ToString(), "Atención", MessageBoxButtons.YesNo))
                //switch (MessageBox.Show("PIN CODE" + e.NumberOrPasskeyAsString, "EMPAREJAMINETO", MessageBoxButtons.YesNo))
                {
                    case DialogResult.Yes:
                        e.Confirm = true;
                        MessageBox.Show("Bienvenido Nuevamente!");
                        break;
                    case DialogResult.No:
                        e.Confirm = false;
                        break;
                }
            }
        }

页面加载时:

ObexListener obexListener = new ObexListener(ObexTransport.Bluetooth);
            BluetoothWin32Authentication bluetoothWin32 = new BluetoothWin32Authentication(codigo);
            Guid guid = new Guid(BluetoothService.SerialPort.ToString());
            obexListener.Start();

            if (obexListener.IsListening)
            {
                timer2.Start();
                ObexListenerContext context = obexListener.GetContext();
                context.Request.WriteFile(archivoBluetooth);
                obexListener.Close();
            }
1个回答

0

这是两个针对ObexListener的扩展方法,可以给GetContext()添加超时功能:

public static class ObexListenerExtensions
{
    public static ObexListenerContext GetContext(this ObexListener listener, int timeout)
    {
        var task = Task.Run(async () => await listener.GetContextAsync(timeout));
        return task.Result;
    }

    public static async Task<ObexListenerContext> GetContextAsync(this ObexListener obexListener, int timeout)
    {
        var task = Task.Run(() => obexListener.GetContext());

        if (await Task.WhenAny(task, Task.Delay(timeout)) == task)
        {
            return task.Result;
        }
        else
        {
            throw new TimeoutException();
        }
    }
}

尝试将其作为非嵌套类添加到您的代码中,然后只需替换:

ObexListenerContext context = obexListener.GetContext();

使用:

ObexListenerContext context = obexListener.GetContext(1000);

这里的timeput是以毫秒为单位的。希望能有所帮助。


感谢Kozhevnikov。 - Joel
嗨Koz,代码运行得很好,谢谢。但是当时间到期时,在第一个方法“GetContext”中的“return task.Result;”返回一个错误。异常显示“TimeoutException: Se excedió el tiempo de espera de la operación.”,然后程序崩溃了。 - Joel
这是预期的行为。你看,当超时时间到期时,方法 GetContextAsync() 会抛出 TimeoutException 异常。在这种情况下,当代码尝试访问 GetContext 中的 task.Result 时,异常将再次在此特定行中生成。您可以根据需要更改 GetContextAsync() 的实现。例如,在超时时间到期时返回 null,然后检查结果是否为 null。我添加了 TimeoutException 只是为了说明这个想法。 - KozhevnikovDmitry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接