当前位置: 首页 > 知识库问答 >
问题:

插座windows存储应用程序的ConnectAsync不喜欢Async

能远
2023-03-14

Windows商店应用程序至少可以说是令人沮丧的;只是足够接近常规的. net而陷入困境。

我在任务、等待和套接字中工作的问题。

我有以下代码:

    public async Task<string> Connect(string hostName, int portNumber)
    {
        string result = string.Empty;

        // Create DnsEndPoint. The hostName and port are passed in to this method.
        DnsEndPoint hostEntry = new DnsEndPoint(hostName, portNumber);

        // Create a stream-based, TCP socket using the InterNetwork Address Family. 
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // Create a SocketAsyncEventArgs object to be used in the connection request
        SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
        socketEventArg.RemoteEndPoint = hostEntry;

        // Inline event handler for the Completed event.
        // Note: This event handler was implemented inline in order to make this method self-contained.
        socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
        {
            // Retrieve the result of this request
            result = e.SocketError.ToString();

            // Signal that the request is complete, unblocking the UI thread
            _clientDone.Set();
        });

        // Sets the state of the event to nonsignaled, causing threads to block
        _clientDone.Reset();

        // Make an asynchronous Connect request over the socket
        await _socket.ConnectAsync(socketEventArg);

        // Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
        // If no response comes back within this time then proceed
        _clientDone.WaitOne(TIMEOUT_MILLISECONDS);

        return result;
    }

我开始在应用程序中添加Async/await以防止UI问题。但当我进入这个函数并将Await添加到

            await _socket.ConnectAsync(socketEventArg);

我收到错误:

错误 CS1929 “bool” 不包含 'GetAwaiter' 的定义,最佳扩展方法重载 'WindowsRuntimeSystemExtensions.GetAwaiter(IAsyncAction)' 需要类型为“IAsyncAction”的接收器

在查看连接同步的文档时,连接同步似乎应该支持等待…

它不支持等待吗?

共有1个答案

巫马刚洁
2023-03-14

不,ConnectAsync不是TAP方法,因此不能与await一起使用。

我对任何使用原始套接字的人的第一条建议是“不要”。如果可以,使用REST API(带有< code>HttpClient)或< code>SignalR API。原始套接字有很多缺陷。

如果您必须使用原始套接字(即,另一端正在使用自定义TCP/IP协议,而您没有能力修复这种情况),那么首先要注意的是< code>Socket类在一个类中有三个完整的API。

第一个是看似简单的同步API(Connect),我不建议将其用于任何生产代码。第二个是标准的APM模式(BeginConnect/EndConnect)。第三个是特定于 Socket 类 (ConnectAsync) 的专用异步模式;此专用 API 的使用比标准异步 API 复杂得多,并且仅在受限环境中进行聊天套接字通信并且需要减少通过垃圾回收器的对象改动时才需要。

请注意,没有等待兼容的API。我还没有和微软的任何人谈过这个问题,但我强烈怀疑他们只是认为Socket类已经有太多的成员了(3个完整的API;添加一个等待-兼容的会添加第四个完整的API),这就是为什么当他们将TAP-模式(等待-兼容的)成员添加到BCL中的其他类型时,它被跳过了。

要使用的正确API-在99.999%的情况下很容易-是APM API。您可以使用TaskFacory. FromAsync创建自己的TAP包装器(与wait一起使用)。我喜欢使用扩展方法来做到这一点,如下所示:

public static Task ConnectTaskAsync(this Socket socket, EndPoint remoteEP)
{
  return Task.Factory.FromAsync(socket.BeginConnect, socket.EndConnect, remoteEP, null);
}

然后,您可以在套接字上的任何位置调用它,如下所示:

await _socket.ConnectTaskAsync(hostEntry);
 类似资料:
  • 问题内容: 这是一个简单的问题,我似乎想不出解决方案。 我在存储过程中定义了这个: @communityDesc是“ aaa,bbb,ccc” 在我的实际查询中,我尝试使用 但这不起作用,因为我的逗号在字符串内,而不是像这样的“ aaa”,“ bbb”,“ ccc” 所以我的问题是,对@communityDesc我可以做些什么,使其与我的IN语句一起工作,例如重新格式化字符串吗? 问题答案: 首先

  • 问题内容: 是否可以在一个查询中将多个SQL LIKE通配符串在一起-像这样? 目的是查找同时包含通配符但没有特定顺序的记录。 问题答案: 正确的SQL语法是:

  • 喜欢资讯 取消喜欢资讯 资讯喜欢列表 喜欢资讯 POST /news/{news}/likes Response Headers Status: 201 Created 取消喜欢资讯 DELETE /news/{news}/likes Response Headers Status: 204 No Content 资讯喜欢列表 GET /news/{news}/likes Respons

  • 点喜欢 取消喜欢 喜欢的人列表 点喜欢 POST /feeds/:feed/like Response Status: 201 Created { "message": [ "操作成功" ] } 通知类型 { "channel": "feed:digg", // 通知关键字 "target": 325, // 动态id "content": "@2222 点喜欢了

  • 问题内容: 要从好的例子中学习,最好的开源Google App Engine应用程序是什么? 我不在乎它是基于Java还是Python。 请每个答案一个应用程序。随时添加到实时应用程序(如果有)和项目页面的链接。 问题答案: Rietveld当然

  • 我在PostgresQL中有一个表feed_item_likes_dislikes(feed_item_id,user_id,vote),其中 feed_item_id是uuid 用户id为整数 投票=正确那么这是一个类似 投票=FALSE那么这是一种厌恶 vote=NULL表示用户最初喜欢或不喜欢,但通过取消通知返回并删除了投票 我还有另一个表feed_item_likes_dislikes_a