将JS回调函数传递给C#RT组件错误:"无法将类型为'mydb.SQLite3JSNoCallback'的对象强制转换为'mydb.SQLite3JSNoCallback'"

Jay*_*Jay 0 javascript c# 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 */
});
Run Code Online (Sandbox Code Playgroud)

我写了这样的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();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,当我从Visual Studio执行此操作时,我收到了类型转换错误,我确信我在某处声明了委托或其他地方时犯了错误,

有人可以告诉我我做错了什么以及如何纠正这个问题.

错误信息 下载示例项目的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();
}
Run Code Online (Sandbox Code Playgroud)

现在,在执行someCallback()时发生错误,错误与上面的屏幕截图相同,只更改了委托."无法将'mydb.SQLite3JSNoCallback'类型的对象强制转换为'mydb.SQLite3JSNoCallback'."

Jer*_*vel 5

正如你所注意到的那样,这是因为异步性.我发现通过在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);
   }
}
Run Code Online (Sandbox Code Playgroud)

Javascript通用应用

 var obj = new CallbackComponent.Test();

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

解:

切换到

CoreApplication.MainView.CoreWindow.
 Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
    callback(15);
});
Run Code Online (Sandbox Code Playgroud)