微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Visual Studio中将RingCentral SMS控制台应用程序转换为Forms应用程序?

如何解决如何在Visual Studio中将RingCentral SMS控制台应用程序转换为Forms应用程序?

我需要从我的VB.net Windows窗体应用程序发送SMS消息。 RingCentral文档提供了一个C#控制台应用程序示例,使用InstantVB转换为VB.net相当简单。下面的代码可以正常工作,因为它是C#示例的直接翻译,但仍是控制台应用程序。 (哦,他们的示例有一个我必须修复的错误。RINGCENTRAL_PRODUCTION应该为布尔值False,而不是示例中的字符串“ False”。)

无论如何...我一直在尝试在Windows Forms应用程序中运行类似的代码 但是,当然,我没有Forms应用程序的Sub Main。因此,我尝试将代码放入Form.Load事件。但是这样做后,它总是挂在Authorize行上,没有任何错误消息-它一直挂起,直到我单击IDE中的“暂停”(中断)按钮。

我整天都在工作,在线搜索答案,非常感谢任何指导。

Imports System
Imports System.Threading.Tasks
Imports RingCentral

Namespace Send_SMS
    Friend Class Program
        Private Const RECIPIENT As String = "9165551212"
        Private Const RINGCENTRAL_CLIENTID As String = "_not_my_real_client_ID"
        Private Const RINGCENTRAL_CLIENTSECRET As String = "_not_my_real_client_secret_"
        Private Const RINGCENTRAL_PRODUCTION As Boolean = False

        Private Const RINGCENTRAL_USERNAME As String = "+14245551212"
        Private Const RINGCENTRAL_PASSWORD As String = "notarealpassword"
        Private Const RINGCENTRAL_EXTENSION As String = "101"

        Private Shared restClient As RestClient

        Shared Sub Main(ByVal args() As String)
            restClient = New RestClient(RINGCENTRAL_CLIENTID,RINGCENTRAL_CLIENTSECRET,RINGCENTRAL_PRODUCTION)

            restClient.Authorize(RINGCENTRAL_USERNAME,RINGCENTRAL_EXTENSION,RINGCENTRAL_PASSWORD).Wait()
            send_sms().Wait()
        End Sub

        Private Shared Async Function send_sms() As Task
            Dim parameters = New CreateSMSMessage()
            parameters.from = New MessageStoreCallerInfoRequest With {.phoneNumber = RINGCENTRAL_USERNAME}
            parameters.to = New MessageStoreCallerInfoRequest() {
                New MessageStoreCallerInfoRequest With {.phoneNumber = RECIPIENT}
            }
            parameters.text = "Hello World from VB.net" '< I changed that part.
            Dim resp = Await restClient.Restapi().Account().Extension().Sms().Post(parameters)
            Console.WriteLine("SMS sent. Message status: " & resp.messageStatus)
        End Function


    End Class
End Namespace

仅供参考,以下是C#中的原始版本(已修复错误):

using System;
using System.Threading.Tasks;
using RingCentral;

namespace Send_SMS
{
    class Program
    {
        const string RECIPIENT = "9165551212";
        const string RINGCENTRAL_CLIENTID = "_not_my_real_client_ID";
        const string RINGCENTRAL_CLIENTSECRET = "_not_my_real_client_secret_";
        const Boolean RINGCENTRAL_PRODUCTION = false;

        const string RINGCENTRAL_USERNAME = "+14245551212";
        const string RINGCENTRAL_PASSWORD = "notarealpassword";
        const string RINGCENTRAL_EXTENSION = "101";

        static RestClient restClient;

        static void Main(string[] args)
        {
            restClient = new RestClient(RINGCENTRAL_CLIENTID,RINGCENTRAL_PRODUCTION);

            restClient.Authorize(RINGCENTRAL_USERNAME,RINGCENTRAL_PASSWORD).Wait();
            send_sms().Wait();
        }
        static private async Task send_sms()
        {
            var parameters = new CreateSMSMessage();
            parameters.from = new MessageStoreCallerInfoRequest { phoneNumber = RINGCENTRAL_USERNAME };
            parameters.to = new MessageStoreCallerInfoRequest[] { new MessageStoreCallerInfoRequest { phoneNumber = RECIPIENT } };
            parameters.text = "Hello World from C#";

            var resp = await restClient.Restapi().Account().Extension().Sms().Post(parameters);
            Console.WriteLine("SMS sent. Message status: " + resp.messageStatus);
        }
    }
}

解决方法

表单应用程序和控制台应用程序之间没有任何神奇的区别。

创建一个新的Forms应用程序(具有一个名为Form1的表单,在表单上放置一个按钮并保留默认名称Button1 [但是请允许我稍后再更改]),右键单击。解决方案资源管理器,然后选择“管理Nuget程序包”,浏览并安装RingCentral.Net程序包

将此代码粘贴到Form1.vb的所有代码的顶部:

Imports RingCentral

Public Class Form1
    Private Async Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click

        restClient = New RestClient(RINGCENTRAL_CLIENTID,RINGCENTRAL_CLIENTSECRET,RINGCENTRAL_PRODUCTION)

        Await restClient.Authorize(RINGCENTRAL_USERNAME,RINGCENTRAL_EXTENSION,RINGCENTRAL_PASSWORD)
        Await send_sms()

    End Sub

    Private Const RECIPIENT As String = "9165551212"
    Private Const RINGCENTRAL_CLIENTID As String = "_not_my_real_client_ID"
    Private Const RINGCENTRAL_CLIENTSECRET As String = "_not_my_real_client_secret_"
    Private Const RINGCENTRAL_PRODUCTION As Boolean = False

    Private Const RINGCENTRAL_USERNAME As String = "+14245551212"
    Private Const RINGCENTRAL_PASSWORD As String = "notarealpassword"
    Private Const RINGCENTRAL_EXTENSION As String = "101"

    Private Shared restClient As RestClient



    Private Shared Async Function send_sms() As Task
        Dim parameters = New CreateSMSMessage()
        parameters.from = New MessageStoreCallerInfoRequest With {.phoneNumber = RINGCENTRAL_USERNAME}
        parameters.to = New MessageStoreCallerInfoRequest() {
                New MessageStoreCallerInfoRequest With {.phoneNumber = RECIPIENT}
            }
        parameters.text = "Hello World from VB.net" '< I changed that part.
        Dim resp = Await restClient.Restapi().Account().Extension().Sms().Post(parameters)
        Console.WriteLine("SMS sent. Message status: " & resp.messageStatus)
    End Function

End Class

自然,由于代码中的细节是虚假的,所以我得到了一个例外,但这至少是服务的响应!

enter image description here


奖金:等待和任务101:

可以等待返回Tasks的方法(功能/子)。包含await关键字的方法需要在其代码正文中标记为async。如果运行返回Task(Of X)的方法,则应在运行时开始执行任务时迅速返回Task(Of X)。您可能会想到,任务现在是一个空容器,任务完成后将用X填充。如果您想将X放入其中,await将等待任务完成,然后为您拉出X。 “当X准备好时,等待将X的Task转换为X”。当程序的线程正在await发生这种情况时,它可以返回到之前所做的任何事情(可能是绘制UI),这很好,因为它看起来像您的应用尚未挂起。

您应该注意,这有点像保存您的计算机游戏,并且当朋友来喝咖啡时关闭计算机(此任务需要一段时间)-朋友去了,您回到游戏中,重新加载保存的状态,一切都保持原状。您的程序处于等待状态,保存了游戏并开始执行其他操作。任务完成后,它又回来了,重新加载了游戏,并从中断的地方继续进行

您会注意到Task(Of X)具有其他类似Result属性的内容。如果您访问该目录而不是等待它,那么程序将在任务完成时卡住,然后您得到X。在一个可能不重要的控制台应用程序中,该控制台应用程序可能不会做任何其他事情在此期间,但UI应用程序需要绘制其UI,否则Windows会认为它没有响应。

我以Task(Of X)为首,因为它可能更容易理解“一个任务,该任务需要一些时间,然后给我我想要的东西”。对于返回Task(即任务中没有输出对象)的方法,您只需Await即可完成。 Await不会挖掘出任何结果对象,因为没有结果对象,但是您的程序仍然能够绘制其UI。在任务上调用Wait()也会等待它完成,但是这样做会阻塞您的UI

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。