我的问题是什么?
当我说“闪烁绿色”时,无人机将完全按照我的要求进行操作。效果很好。
当我再次说“Blink green”时,它会执行代码,但无人机没有给出响应。无人机只在第一时间给出了回应。所以每次我都必须重新启动程序才能使其工作。烦人的...
第二次会发生什么?
它会做同样的事情,它也在执行代码,但无人机没有给出响应。
代码如下:
private static void _speechRecognitionEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
switch (e.Result.Text)
{
case "Blink green":
Task.Run((Action)blinkGreen);
break;
}
}
// ONLY WORKS THE FIRST TIME
// WHEN I SAY "BLINK GREEN" AGAIN, IT'S WILL EXECUTE THE
// CODE BUT THE DRONE DOESN'T GIVE A RESPONSE. ONLY THE
// FIRST TIME (SO I HAVE TO RESTART THE PROGRAM)
public static async void blinkGreen()
{
var func = Edge.Func(@"
var arDrone = require('ar-drone');
var client = arDrone.createClient();
return function(data, callback){
client.animateLeds('blinkGreen',5,2);
callback(null, data);
}
");
Console.WriteLine(await func("BLINK EXECUTED!"));
}
我认为发生了一些事情:
var arDrone = require('ar-drone');
var client = arDrone.createClient();
我想我可以创建一个客户端。我必须创建并重用客户端实例,这样我就可以使用可以解决问题的同一个客户端。但是我不知道如何使用 Edge.js 模块来做到这一点...
我希望有人能帮我解决这个问题。
谢谢,
杰米
最佳答案
@杰伊>
我走得更远了,让我们看看我做了什么。
我创建了一个 bool 值来检查是否已经有一个客户端和一个变量来保存客户端。
static bool clientCreated = false; static object currentClient;
在项目开始时,我创建了一张支票以获取现有或新客户
// First check to get an existing or new client currentClient = GetOrCreateClient();
我创建了一个返回现有或新客户的方法
public static object GetOrCreateClient() { // If there is already a client if (clientCreated) { Console.WriteLine("There's already a client!"); } // If there is no client else { // Set boolean clientCreated = true; // Create a client var newClient = Edge.Func(@" var arDrone = require('ar-drone'); var client = arDrone.createClient(); return function(data, callback){ callback(null, data); } "); Console.WriteLine("Client created!"); // Return new client return newClient; } // Return current client return currentClient; }
以及执行 Action (无人机动画)的功能方法应该使用相同的客户端
public static async void blinkGreen() { // Get an existing or new client var client = GetOrCreateClient(); // Execute the functionality var func = Edge.Func(@" var arDrone = require('ar-drone'); // ACTUALLY THIS ONE IS ALREADY DEFINED IN THE METHOD GetOrCreateClient() var client = I WANT HERE THE CLIENT, BUT HOW? return function(data, callback){ client.animateLeds('blinkGreen',5,2); callback(null, data); } "); Console.WriteLine(await func("BLINK EXECUTED!")); }
现在我被一些事情困住了,因为这是将客户端全局保存在一个对象中的正确方法吗?因为 GetOrCreateClient()
方法返回以下对象:
`System.Func`2[System.Object,System.Threading.Tasks.Task`1[System.Object]]`
所以我的下一个问题是,如何在功能中使用客户端对象?
var client = GetOrCreateClient();
变量应放入:
var func = Edge.Func(@"
var arDrone = require('ar-drone'); // ACTUALLY THIS ONE IS ALREADY DEFINED IN THE METHOD GetOrCreateClient()
var client = I WANT HERE THE CLIENT, BUT HOW?
断开客户端连接的另一种方法也可以解决问题,但确实会增加开销和延迟。
关于c# - 如何使用 Edge.js 模块创建和重用实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373241/