c# - 将 JS 回调函数传递给 C# RT 组件错误 : "Unable to cast object of the type ' mydb. SQLite3JSNoCallback' 到 'mydb.SQLite3JSNoCallback' "

标签 c# javascript callback windows-runtime

我有一个 Javascript Windows 8 应用程序。我正在使用 C# 编写一个 WinRT 组件 DLL,用于与数据库连接。

对于所有函数,例如 OpenDB、ExecuteUpdate、ExecuteQuery(返回一行、返回一列值),我已经完成了 IASyncOperation 并且非常成功。

但是为了逐行处理大型结果集中的每一行,我需要将回调函数从 javascript 传递到 C# WinRT 组件 DLL。所以代码就像这样,

My.WinRT.Component.Object.processEachRowASyc(query, arguments, function(row) {
    /* Row specific processing */
}).then(function(result) {
    /* Process after Entire Row processing is Complete */
});

我已经编写了这样的 RT 组件,

namespace mydb
{
    public void delegate MyJSCallback(string msg);
    public class Database {

        public static IAsyncOperation<Database> OpenDB(string dbFile)
        {
           /* Open DB */
        }

        public IAsyncOperation<Database> ProcessEachRowASync(string sql,[ReadOnlyArray()] object[] arg, MyJSCallback myJSCallback)
        {
            return Task<Database>.Run(() =>
            {
            /* Query Processing */
            IDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                string toRet = "{\"Name\":\"Raju\", \"Age\":\"21\"}";

                //Javascript callback function called.
                myJSCallback(toRet);
            }
            return this;

            }).AsAsyncOperation();
        }
    }

}

现在,当我从 Visual Studio 执行此命令时,我遇到了类型转换错误,我确信我在声明委托(delegate)或其他地方犯了错误,

有人可以告诉我我做错的地方以及如何纠正吗?

Error Message 下载示例项目的 URL 是 http://sdrv.ms/18ff3Hl

为了进一步简化,我在 RTComponent 中编写了另一个函数,仅显示回调错误,RT 组件中的代码如下

public delegate void SQLite3JSNoCallback();
public IAsyncOperation<int> GetLastInsertRowId(SQLite3JSNoCallback someCallback)
{
    return Task<int>.Run(() =>
    {
        someCallback();
        return 0;
    }).AsAsyncOperation();
}

现在错误发生在执行someCallback()时,错误与上面的屏幕截图相同,仅更改了委托(delegate)。 “无法将‘myd​​b.SQLite3JSNoCallback’类型的对象转换为‘mydb.SQLite3JSNoCallback’。”

最佳答案

正如您所注意到的,这是由于异步性而发生的。我发现通过在 UI 线程上调用回调,它现在将按预期工作。

WinRT 组件:

public delegate void DoStuffCallback(int num);

public sealed class Test
{
   public void ShowStuffOnOutput(int x, int y, DoStuffCallback callback)
   {
       Debug.WriteLine("pre-callback");
       Debug.WriteLine(x);

       Task.Run(() =>
       {
           callback(15);
       });

       Debug.WriteLine("post-callback");
       Debug.WriteLine(y);
   }
}

Javascript 通用应用程序

 var obj = new CallbackComponent.Test();

 obj.showStuffOnOutput(1, 2, function(num) {
     console.log("callback in JS!");
     console.log(num);
 });

解决方案:

切换到

CoreApplication.MainView.CoreWindow.
 Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
    callback(15);
});

关于c# - 将 JS 回调函数传递给 C# RT 组件错误 : "Unable to cast object of the type ' mydb. SQLite3JSNoCallback' 到 'mydb.SQLite3JSNoCallback' ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16278299/

相关文章:

javascript - 未知数量的 <li> 的 jQuery 动画

javascript - 为什么 IE 不显示此 alert()?

javascript - 哪个 jPlayer 事件指定开始播放的能力?

jquery-ui - Lift - 使用 Ajax 提交自动完成

ios - 来自其他类的函数的回调

c# - TimerCallback 不返回值 C#

c# - 替代 String.Replace

c# - 远程调试asp.net

c# - 在 C# 中过滤巨大列表的最高效方法?

c# - 在 DbContext 的子类中使用反射调用 DbSet<Type>.Add() 方法