jueves, 25 de julio de 2019

C# Ejecutando un metodo asincrono como sincrono

Hay varias formas de ejecutar métodos asíncronos en un contexto sincrónico: 

La mejor manera de ejecutar cualquier método asíncrono y esperar a que se complete es usar la palabra clave await de la siguiente manera:
Lo que se espera aquí es devolver el resultado de la operación de forma inmediata y sincrónica si la operación ya se ha completado o, si no lo ha hecho, programar una continuación para ejecutar el resto de la palabra clave async antes de devolver el control a la persona que llama. Cuando finaliza la operación asíncrona , se ejecutará la finalización programada. Esto es excelente para evitar los interbloqueos y también se puede usar dentro de un bloque try / catch para obtener la excepción generada por el  propio método AsyncMethod .
El único inconveniente de usar la palabra clave async es que requiere que el método que contiene se marque como  async también. Si no puede hacerlo, solo puede optar por una solución alternativa menos segura para lograr el mismo objetivo como los que se explican a continuación.
La siguiente forma es aun mejor que la anterior:
Si se ve obligado a usar un  método que contiene sincronización , puede usar la siguiente clase auxiliar:
Entonces puedes usarlo de esa manera:
Esta solución es definitivamente más compleja que la anterior, pero básicamente es la única forma decente de realizar una llamada asíncrona dentro de sincronización . Como podemos ver, la clase auxiliar básicamente crea, configura e inicia una tarea asíncrona sobre la marcha, luego la desenvuelve y  espera sincrónicamente su resultado: al igual que el método de espera anterior, este enfoque evitará los interbloqueos y podría usarse dentro de un bloque try / catch para obtener la excepción generada por el  propio AsyncMethod .

Enlaces relacionados:

sábado, 22 de junio de 2019

Validación de formularios utilizando los eventos del teclado (Key Validator) aspx c#

Esta clase permitirá delimitar el tipo de validación que le queremos poner a nuestro text box.


public class KeyCodeValidator
{
    public const string Texto = " if(window.event.keyCode >= 65 && window.event.keyCode <= 90 || window.event.keyCode >= 97 && window.event.keyCode <=122 || window.event.keyCode == 32 || window.event.keyCode == 164 || window.event.keyCode == 165 || window.event.keyCode == 46|| window.event.keyCode >= 192 && window.event.keyCode <= 252) window.event.returnValue=true; else window.event.returnValue=false; ";
    public const string Fecha = " if((window.event.keyCode >= 48 && window.event.keyCode <= 57) || window.event.keyCode == 47) window.event.returnValue=true; else window.event.returnValue=false; ";
    public const string Mail = " if(window.event.keyCode >= 65 && window.event.keyCode <= 90 || window.event.keyCode >= 97 && window.event.keyCode <=122 || window.event.keyCode >=48 && window.event.keyCode <= 57 || window.event.keyCode == 64 || window.event.keyCode == 29 || window.event.keyCode == 45 || window.event.keyCode == 46 || window.event.keyCode == 95) window.event.returnValue=true; else window.event.returnValue=false; ";
    public const string Decimal = " if(window.event.keyCode >= 48 && window.event.keyCode <= 57 || window.event.keyCode == 46 || window.event.keyCode == 44 || window.event.keyCode == 45) window.event.returnValue=true; else window.event.returnValue=false; ";
    public const string AlfaNumerico = " if(window.event.keyCode >= 65 && window.event.keyCode <= 90 || window.event.keyCode >= 97 && key.keyCode <=122 || window.event.keyCode == 32 || window.event.keyCode == 164 || window.event.keyCode == 165 || window.event.keyCode == 46|| window.event.keyCode >= 192 && key.keyCode <= 252 || window.event.keyCode >= 48 && key.keyCode <= 57) window.event.returnValue=true; else window.event.returnValue=false; ";
    public const string Bloqueado = " window.event.returnValue=false;";
    public const string Numerico = " if(window.event.keyCode >= 48 && window.event.keyCode <= 57) window.event.returnValue=true; else window.event.returnValue=false;";
}



Asignarle la validacion al textbox.

En el load del aspx:


txtdsComentario.Attributes.Add("onkeyPress", KeyCodeValidator.Texto);


Con esta validación no dejara teclear las teclas que no estan permitidas.

viernes, 21 de junio de 2019

Crear Linked de base de datos Interna a Azure


Estaba intentando crear un linked server a un servidor interno SQL 2008, hice el linked server de manera normal, el linked server se creó sin problemas, pero al momento de desplegar las tablas aparecía este error.

Reference to database and/or server name in NameBase.sys.sp_tables_rowset2' is not supported in this version of SQL Server. (Microsoft SQL Server, Error: 40515)

Solucion:
Ejecutar estos 3 SPS
El sp se debe ejecutar desde alguna base de datos de la instancia interna


EXEC sp_addlinkedserver
@server='NAMELINKED',
@srvproduct='',    
@provider='sqlncli',
@datasrc=' INSTANCIA.database.windows.net',
@location='',
@provstr='',
@catalog='NAMEBASE'


EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'NAMELINKED',
@useself = 'false',
@rmtuser = 'USER@INSTANCIA.database.windows.net',
@rmtpassword = 'PASSWORDAZURE'

EXEC sp_serveroption 'NAMELINKED', 'rpc out', true


Ejmeplo: