如何解决如何在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
自然,由于代码中的细节是虚假的,所以我得到了一个例外,但这至少是服务的响应!
奖金:等待和任务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 举报,一经查实,本站将立刻删除。