Troubles with Multithreads and Messaging Center in Xamarin.forms










0















I'm developing another sample where Messaging Center send status messages not coupled from device code to my view models.



At this point I used:



  • A alert message;

  • Label in my view;

  • A method by dependency injection from native code(interfaced and created before).

To notice the events before try in View models... etc



For it I used a static view instance in my share application constructor (App.xaml) where in view constructor I Subscript the status.



App (shared)



public partial class App : Application
{
public static ConnectViewModel CVM get; set; // Connection View Model
#region MasterDetailPage
public static MasterDetailPage MDP;
public static NavigationPage NAV = null;
public static MainView _mainpage;
#endregion

public App ()

InitializeComponent();
InitializeApplication();
NAV = new NavigationPage(new StarterView()) BarBackgroundColor = Color.FromHex("701424"), BarTextColor = Color.White ; ;
MDP = new MasterDetailPage();
MDP.BackgroundColor = Xamarin.Forms.Color.FromHex("701424");
_mainpage = new MainView();
MDP.Master = _mainpage;
MDP.Detail = NAV;
MainPage = MDP;
MainPage.Title = "H2X";


private void InitializeApplication()


if (CVM == null)

CVM = new ConnectViewModel();




(View shared)



public MainView ()

InitializeComponent ();

string a="Test";
#region MessegeCenter

MessagingCenter.Subscribe<string,string>("APP", "Message_Received", async (sender,arg) =>

string b = a;
a = $"arg";

try

* await DisplayAlert(App.BM_Status, "Ok", "OK");*
catch(Exception e)

string a = e.Message;

* generic_label_of_my_view = generic_label_of_my_view + "+";//It's not async one*
*string test = App.CVM.All_conn.Msg_Reciever();//Injection - It's not async one*

);
#endregion




Into the specific platform code (Device - UWP):



  • I create a timer that sends messages after some time instanced in mainpage constructor.

  • A HID device that notice me when some msg comes from USB.

The dispatcherTimer



void dispatcherTimer_Tick(object sender, object e)

DateTimeOffset time = DateTimeOffset.Now;
TimeSpan span = time - lastTime;
lastTime = time;
//Time since last tick should be very very close to Interval
TimerLog.Text += timesTicked + "t time since last tick: " + span.ToString() + "n";
timesTicked++;
if (timesTicked > timesToTick)

MessagingCenter.Send<string,string>("APP","Message_Received","MR");




The HIDInit and HID InputReport event



 public async void HID_Init()



var selector = HidDevice.GetDeviceSelector(a_Id, b_Id, c_ID, d_ID);
var devices = await DeviceInformation.FindAllAsync(selector);

if (devices.Any())

// At this point the device is available to communicate with
// So we can send/receive HID reports from it generically


console_text = "HID devices found: " + devices.Count;

device = await HidDevice.FromIdAsync(devices.ElementAt(0).Id, FileAccessMode.ReadWrite);

if (device != null)

// At this point the device is available to communicate with
// create my input caller/event
device.InputReportReceived += inputReportReceived;//invoke caller

deviceWatcher = DeviceInformation.CreateWatcher(selector);
deviceWatcher.Removed += deviceRemovedEventHandler;//checa se nada foi removido
deviceWatcher.Start();

else

// There were no HID devices that met the selector criteria
throw new Exception("MUTT HID device not found");



else

// There were no HID devices that met the selector criteria
console_text = "HID device not found";



private void inputReportReceived(HidDevice sender, HidInputReportReceivedEventArgs args)

var bbytes = new byte[10];
wait_streaming = true;
DataReader dataReader = DataReader.FromBuffer(args.Report.Data);
dataReader.ReadBytes(bbytes);

console_text += System.Text.Encoding.ASCII.GetString(bbytes, 2, bbytes[1]);

is_read = false;

wait_streaming = false;

MessagingCenter.Send<string,string>("App","Message_Received","MR");




When I run any case with Dispatchertimer "works".



When I run by the Hidinputreport event with the alertmessage creates a system.exception in alertmessege line.



This is the "System.Exception"



if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>

if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
;
endif


When I run by the Hidinputreport event with the Label a marshalled interface crash with other thread in my call from messegingCenter in native code.



System.Exception: 'The application call a marshalled interface for another thread.

(Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))'


When I run the injection, works but I'm afraid that this Thread troubles make some semantical bug in my project cause I need to call INofifyPropertyChanged in shared code to print in my view the message but ...



Can I call it into the sender into Messeging Center Subscripte ?



How can I correct the other troubles with Threads ? Manual Reset Events ? EventWaitHandle ? (Inheritance:Object->MarshalByRefObject->WaitHandle->EventWaitHandle) ... so invasive way :/



I'm sorry if I ask some stupid question or show stupit code here ... but I don't know how to organize it WELL



Thank you in advance



Guilherme










share|improve this question



















  • 2





    if you google the exception, it appears that this is caused by trying to invoke a UI operation from a background thread. However, since you don't say which line causes the exception I can't tell you what to change

    – Jason
    Nov 14 '18 at 21:10











  • I'm sorry, Jason, but how could I check the line of exception ? Try catch ? It didn't find when I tried :/

    – Guilherme Marques
    Nov 21 '18 at 14:18
















0















I'm developing another sample where Messaging Center send status messages not coupled from device code to my view models.



At this point I used:



  • A alert message;

  • Label in my view;

  • A method by dependency injection from native code(interfaced and created before).

To notice the events before try in View models... etc



For it I used a static view instance in my share application constructor (App.xaml) where in view constructor I Subscript the status.



App (shared)



public partial class App : Application
{
public static ConnectViewModel CVM get; set; // Connection View Model
#region MasterDetailPage
public static MasterDetailPage MDP;
public static NavigationPage NAV = null;
public static MainView _mainpage;
#endregion

public App ()

InitializeComponent();
InitializeApplication();
NAV = new NavigationPage(new StarterView()) BarBackgroundColor = Color.FromHex("701424"), BarTextColor = Color.White ; ;
MDP = new MasterDetailPage();
MDP.BackgroundColor = Xamarin.Forms.Color.FromHex("701424");
_mainpage = new MainView();
MDP.Master = _mainpage;
MDP.Detail = NAV;
MainPage = MDP;
MainPage.Title = "H2X";


private void InitializeApplication()


if (CVM == null)

CVM = new ConnectViewModel();




(View shared)



public MainView ()

InitializeComponent ();

string a="Test";
#region MessegeCenter

MessagingCenter.Subscribe<string,string>("APP", "Message_Received", async (sender,arg) =>

string b = a;
a = $"arg";

try

* await DisplayAlert(App.BM_Status, "Ok", "OK");*
catch(Exception e)

string a = e.Message;

* generic_label_of_my_view = generic_label_of_my_view + "+";//It's not async one*
*string test = App.CVM.All_conn.Msg_Reciever();//Injection - It's not async one*

);
#endregion




Into the specific platform code (Device - UWP):



  • I create a timer that sends messages after some time instanced in mainpage constructor.

  • A HID device that notice me when some msg comes from USB.

The dispatcherTimer



void dispatcherTimer_Tick(object sender, object e)

DateTimeOffset time = DateTimeOffset.Now;
TimeSpan span = time - lastTime;
lastTime = time;
//Time since last tick should be very very close to Interval
TimerLog.Text += timesTicked + "t time since last tick: " + span.ToString() + "n";
timesTicked++;
if (timesTicked > timesToTick)

MessagingCenter.Send<string,string>("APP","Message_Received","MR");




The HIDInit and HID InputReport event



 public async void HID_Init()



var selector = HidDevice.GetDeviceSelector(a_Id, b_Id, c_ID, d_ID);
var devices = await DeviceInformation.FindAllAsync(selector);

if (devices.Any())

// At this point the device is available to communicate with
// So we can send/receive HID reports from it generically


console_text = "HID devices found: " + devices.Count;

device = await HidDevice.FromIdAsync(devices.ElementAt(0).Id, FileAccessMode.ReadWrite);

if (device != null)

// At this point the device is available to communicate with
// create my input caller/event
device.InputReportReceived += inputReportReceived;//invoke caller

deviceWatcher = DeviceInformation.CreateWatcher(selector);
deviceWatcher.Removed += deviceRemovedEventHandler;//checa se nada foi removido
deviceWatcher.Start();

else

// There were no HID devices that met the selector criteria
throw new Exception("MUTT HID device not found");



else

// There were no HID devices that met the selector criteria
console_text = "HID device not found";



private void inputReportReceived(HidDevice sender, HidInputReportReceivedEventArgs args)

var bbytes = new byte[10];
wait_streaming = true;
DataReader dataReader = DataReader.FromBuffer(args.Report.Data);
dataReader.ReadBytes(bbytes);

console_text += System.Text.Encoding.ASCII.GetString(bbytes, 2, bbytes[1]);

is_read = false;

wait_streaming = false;

MessagingCenter.Send<string,string>("App","Message_Received","MR");




When I run any case with Dispatchertimer "works".



When I run by the Hidinputreport event with the alertmessage creates a system.exception in alertmessege line.



This is the "System.Exception"



if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>

if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
;
endif


When I run by the Hidinputreport event with the Label a marshalled interface crash with other thread in my call from messegingCenter in native code.



System.Exception: 'The application call a marshalled interface for another thread.

(Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))'


When I run the injection, works but I'm afraid that this Thread troubles make some semantical bug in my project cause I need to call INofifyPropertyChanged in shared code to print in my view the message but ...



Can I call it into the sender into Messeging Center Subscripte ?



How can I correct the other troubles with Threads ? Manual Reset Events ? EventWaitHandle ? (Inheritance:Object->MarshalByRefObject->WaitHandle->EventWaitHandle) ... so invasive way :/



I'm sorry if I ask some stupid question or show stupit code here ... but I don't know how to organize it WELL



Thank you in advance



Guilherme










share|improve this question



















  • 2





    if you google the exception, it appears that this is caused by trying to invoke a UI operation from a background thread. However, since you don't say which line causes the exception I can't tell you what to change

    – Jason
    Nov 14 '18 at 21:10











  • I'm sorry, Jason, but how could I check the line of exception ? Try catch ? It didn't find when I tried :/

    – Guilherme Marques
    Nov 21 '18 at 14:18














0












0








0








I'm developing another sample where Messaging Center send status messages not coupled from device code to my view models.



At this point I used:



  • A alert message;

  • Label in my view;

  • A method by dependency injection from native code(interfaced and created before).

To notice the events before try in View models... etc



For it I used a static view instance in my share application constructor (App.xaml) where in view constructor I Subscript the status.



App (shared)



public partial class App : Application
{
public static ConnectViewModel CVM get; set; // Connection View Model
#region MasterDetailPage
public static MasterDetailPage MDP;
public static NavigationPage NAV = null;
public static MainView _mainpage;
#endregion

public App ()

InitializeComponent();
InitializeApplication();
NAV = new NavigationPage(new StarterView()) BarBackgroundColor = Color.FromHex("701424"), BarTextColor = Color.White ; ;
MDP = new MasterDetailPage();
MDP.BackgroundColor = Xamarin.Forms.Color.FromHex("701424");
_mainpage = new MainView();
MDP.Master = _mainpage;
MDP.Detail = NAV;
MainPage = MDP;
MainPage.Title = "H2X";


private void InitializeApplication()


if (CVM == null)

CVM = new ConnectViewModel();




(View shared)



public MainView ()

InitializeComponent ();

string a="Test";
#region MessegeCenter

MessagingCenter.Subscribe<string,string>("APP", "Message_Received", async (sender,arg) =>

string b = a;
a = $"arg";

try

* await DisplayAlert(App.BM_Status, "Ok", "OK");*
catch(Exception e)

string a = e.Message;

* generic_label_of_my_view = generic_label_of_my_view + "+";//It's not async one*
*string test = App.CVM.All_conn.Msg_Reciever();//Injection - It's not async one*

);
#endregion




Into the specific platform code (Device - UWP):



  • I create a timer that sends messages after some time instanced in mainpage constructor.

  • A HID device that notice me when some msg comes from USB.

The dispatcherTimer



void dispatcherTimer_Tick(object sender, object e)

DateTimeOffset time = DateTimeOffset.Now;
TimeSpan span = time - lastTime;
lastTime = time;
//Time since last tick should be very very close to Interval
TimerLog.Text += timesTicked + "t time since last tick: " + span.ToString() + "n";
timesTicked++;
if (timesTicked > timesToTick)

MessagingCenter.Send<string,string>("APP","Message_Received","MR");




The HIDInit and HID InputReport event



 public async void HID_Init()



var selector = HidDevice.GetDeviceSelector(a_Id, b_Id, c_ID, d_ID);
var devices = await DeviceInformation.FindAllAsync(selector);

if (devices.Any())

// At this point the device is available to communicate with
// So we can send/receive HID reports from it generically


console_text = "HID devices found: " + devices.Count;

device = await HidDevice.FromIdAsync(devices.ElementAt(0).Id, FileAccessMode.ReadWrite);

if (device != null)

// At this point the device is available to communicate with
// create my input caller/event
device.InputReportReceived += inputReportReceived;//invoke caller

deviceWatcher = DeviceInformation.CreateWatcher(selector);
deviceWatcher.Removed += deviceRemovedEventHandler;//checa se nada foi removido
deviceWatcher.Start();

else

// There were no HID devices that met the selector criteria
throw new Exception("MUTT HID device not found");



else

// There were no HID devices that met the selector criteria
console_text = "HID device not found";



private void inputReportReceived(HidDevice sender, HidInputReportReceivedEventArgs args)

var bbytes = new byte[10];
wait_streaming = true;
DataReader dataReader = DataReader.FromBuffer(args.Report.Data);
dataReader.ReadBytes(bbytes);

console_text += System.Text.Encoding.ASCII.GetString(bbytes, 2, bbytes[1]);

is_read = false;

wait_streaming = false;

MessagingCenter.Send<string,string>("App","Message_Received","MR");




When I run any case with Dispatchertimer "works".



When I run by the Hidinputreport event with the alertmessage creates a system.exception in alertmessege line.



This is the "System.Exception"



if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>

if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
;
endif


When I run by the Hidinputreport event with the Label a marshalled interface crash with other thread in my call from messegingCenter in native code.



System.Exception: 'The application call a marshalled interface for another thread.

(Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))'


When I run the injection, works but I'm afraid that this Thread troubles make some semantical bug in my project cause I need to call INofifyPropertyChanged in shared code to print in my view the message but ...



Can I call it into the sender into Messeging Center Subscripte ?



How can I correct the other troubles with Threads ? Manual Reset Events ? EventWaitHandle ? (Inheritance:Object->MarshalByRefObject->WaitHandle->EventWaitHandle) ... so invasive way :/



I'm sorry if I ask some stupid question or show stupit code here ... but I don't know how to organize it WELL



Thank you in advance



Guilherme










share|improve this question
















I'm developing another sample where Messaging Center send status messages not coupled from device code to my view models.



At this point I used:



  • A alert message;

  • Label in my view;

  • A method by dependency injection from native code(interfaced and created before).

To notice the events before try in View models... etc



For it I used a static view instance in my share application constructor (App.xaml) where in view constructor I Subscript the status.



App (shared)



public partial class App : Application
{
public static ConnectViewModel CVM get; set; // Connection View Model
#region MasterDetailPage
public static MasterDetailPage MDP;
public static NavigationPage NAV = null;
public static MainView _mainpage;
#endregion

public App ()

InitializeComponent();
InitializeApplication();
NAV = new NavigationPage(new StarterView()) BarBackgroundColor = Color.FromHex("701424"), BarTextColor = Color.White ; ;
MDP = new MasterDetailPage();
MDP.BackgroundColor = Xamarin.Forms.Color.FromHex("701424");
_mainpage = new MainView();
MDP.Master = _mainpage;
MDP.Detail = NAV;
MainPage = MDP;
MainPage.Title = "H2X";


private void InitializeApplication()


if (CVM == null)

CVM = new ConnectViewModel();




(View shared)



public MainView ()

InitializeComponent ();

string a="Test";
#region MessegeCenter

MessagingCenter.Subscribe<string,string>("APP", "Message_Received", async (sender,arg) =>

string b = a;
a = $"arg";

try

* await DisplayAlert(App.BM_Status, "Ok", "OK");*
catch(Exception e)

string a = e.Message;

* generic_label_of_my_view = generic_label_of_my_view + "+";//It's not async one*
*string test = App.CVM.All_conn.Msg_Reciever();//Injection - It's not async one*

);
#endregion




Into the specific platform code (Device - UWP):



  • I create a timer that sends messages after some time instanced in mainpage constructor.

  • A HID device that notice me when some msg comes from USB.

The dispatcherTimer



void dispatcherTimer_Tick(object sender, object e)

DateTimeOffset time = DateTimeOffset.Now;
TimeSpan span = time - lastTime;
lastTime = time;
//Time since last tick should be very very close to Interval
TimerLog.Text += timesTicked + "t time since last tick: " + span.ToString() + "n";
timesTicked++;
if (timesTicked > timesToTick)

MessagingCenter.Send<string,string>("APP","Message_Received","MR");




The HIDInit and HID InputReport event



 public async void HID_Init()



var selector = HidDevice.GetDeviceSelector(a_Id, b_Id, c_ID, d_ID);
var devices = await DeviceInformation.FindAllAsync(selector);

if (devices.Any())

// At this point the device is available to communicate with
// So we can send/receive HID reports from it generically


console_text = "HID devices found: " + devices.Count;

device = await HidDevice.FromIdAsync(devices.ElementAt(0).Id, FileAccessMode.ReadWrite);

if (device != null)

// At this point the device is available to communicate with
// create my input caller/event
device.InputReportReceived += inputReportReceived;//invoke caller

deviceWatcher = DeviceInformation.CreateWatcher(selector);
deviceWatcher.Removed += deviceRemovedEventHandler;//checa se nada foi removido
deviceWatcher.Start();

else

// There were no HID devices that met the selector criteria
throw new Exception("MUTT HID device not found");



else

// There were no HID devices that met the selector criteria
console_text = "HID device not found";



private void inputReportReceived(HidDevice sender, HidInputReportReceivedEventArgs args)

var bbytes = new byte[10];
wait_streaming = true;
DataReader dataReader = DataReader.FromBuffer(args.Report.Data);
dataReader.ReadBytes(bbytes);

console_text += System.Text.Encoding.ASCII.GetString(bbytes, 2, bbytes[1]);

is_read = false;

wait_streaming = false;

MessagingCenter.Send<string,string>("App","Message_Received","MR");




When I run any case with Dispatchertimer "works".



When I run by the Hidinputreport event with the alertmessage creates a system.exception in alertmessege line.



This is the "System.Exception"



if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>

if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
;
endif


When I run by the Hidinputreport event with the Label a marshalled interface crash with other thread in my call from messegingCenter in native code.



System.Exception: 'The application call a marshalled interface for another thread.

(Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))'


When I run the injection, works but I'm afraid that this Thread troubles make some semantical bug in my project cause I need to call INofifyPropertyChanged in shared code to print in my view the message but ...



Can I call it into the sender into Messeging Center Subscripte ?



How can I correct the other troubles with Threads ? Manual Reset Events ? EventWaitHandle ? (Inheritance:Object->MarshalByRefObject->WaitHandle->EventWaitHandle) ... so invasive way :/



I'm sorry if I ask some stupid question or show stupit code here ... but I don't know how to organize it WELL



Thank you in advance



Guilherme







c# multithreading xamarin.forms uwp thread-safety






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 14 '18 at 21:25









marc_s

579k12911181264




579k12911181264










asked Nov 14 '18 at 20:47









Guilherme MarquesGuilherme Marques

354210




354210







  • 2





    if you google the exception, it appears that this is caused by trying to invoke a UI operation from a background thread. However, since you don't say which line causes the exception I can't tell you what to change

    – Jason
    Nov 14 '18 at 21:10











  • I'm sorry, Jason, but how could I check the line of exception ? Try catch ? It didn't find when I tried :/

    – Guilherme Marques
    Nov 21 '18 at 14:18













  • 2





    if you google the exception, it appears that this is caused by trying to invoke a UI operation from a background thread. However, since you don't say which line causes the exception I can't tell you what to change

    – Jason
    Nov 14 '18 at 21:10











  • I'm sorry, Jason, but how could I check the line of exception ? Try catch ? It didn't find when I tried :/

    – Guilherme Marques
    Nov 21 '18 at 14:18








2




2





if you google the exception, it appears that this is caused by trying to invoke a UI operation from a background thread. However, since you don't say which line causes the exception I can't tell you what to change

– Jason
Nov 14 '18 at 21:10





if you google the exception, it appears that this is caused by trying to invoke a UI operation from a background thread. However, since you don't say which line causes the exception I can't tell you what to change

– Jason
Nov 14 '18 at 21:10













I'm sorry, Jason, but how could I check the line of exception ? Try catch ? It didn't find when I tried :/

– Guilherme Marques
Nov 21 '18 at 14:18






I'm sorry, Jason, but how could I check the line of exception ? Try catch ? It didn't find when I tried :/

– Guilherme Marques
Nov 21 '18 at 14:18













0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53308483%2ftroubles-with-multithreads-and-messaging-center-in-xamarin-forms%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53308483%2ftroubles-with-multithreads-and-messaging-center-in-xamarin-forms%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

How to read a connectionString WITH PROVIDER in .NET Core?

Museum of Modern and Contemporary Art of Trento and Rovereto

In R, how to develop a multiplot heatmap.2 figure showing key labels successfully