Threading in the C# SDK
Threads in a C# program help you achieve parallelism. By using multiple threads, you can make a C# program run faster and do multiple things simultaneously.
The C# SDK supports both single-threading and multi-threading irrespective of a single user or a multi user app.
Refer to the below code snippets that use multi-threading for a single-user and multi-user app.
Multi-threading in a Multi-user App
Multi-threading for multi-users is achieved using Initializer's static SwitchUser().
Initializer.SwitchUser(UserSignature user, Environment environment, Token token, SDKConfig sdkConfig);
Initializer.SwitchUser(UserSignature user, Environment environment, Token token, SDKConfig sdkConfig, RequestProxy proxy);
The program execution starts from main().
The details of "user1" are given in the variables user1, token1, environment1.
Similarly, the details of another user "user2" are given in the variables user2, token2, environment2.
For each user, an instance of MultiThread class is created.
When start() is called which in-turn invokes run(), the details of user1 are passed to the switchUser function through the MultiThread object. Therefore, this creates a thread for user1.
Similarly, When start() is invoked again, the details of user2 are passed to the switchUser function through the MultiThread object. Therefore, this creates a thread for user2.
using System;
using System.Collections.Generic;
using System.Threading;
using Com.Zoho.API.Authenticator;
using Com.Zoho.API.Authenticator.Store;
using Com.Zoho.Crm.API;
using Com.Zoho.Crm.API.Dc;
using Com.Zoho.Crm.API.Logger;
using Com.Zoho.Crm.API.Record;
using Com.Zoho.Crm.API.Util;
using Newtonsoft.Json;
using static Com.Zoho.API.Authenticator.OAuthToken;
namespace csharpsdksampleapplication
{
public class MultiThread
{
DataCenter.Environment environment;
UserSignature user;
Token token;
string moduleAPIName;
public MultiThread(UserSignature user, DataCenter.Environment environment, Token token, string moduleAPIName)
{
this.environment = environment;
this.user = user;
this.token = token;
this.moduleAPIName = moduleAPIName;
}
static void Main(string[] args)
{
Logger logger = Logger.GetInstance(Logger.Levels.ALL, "/Users/user_name/Documents/csharp_sdk_log.log");
DataCenter.Environment environment1 = USDataCenter.PRODUCTION;
UserSignature user1 = new UserSignature("user1@zoho.com");
TokenStore tokenstore = new FileStore("/Users/user_name/Documents/csharp_sdk_token.txt");
Token token1 = new OAuthToken("clientId1", "clientSecret1", "REFRESH/GRANT token", TokenType.REFRESH, "redirectURL1");
string resourcePath = "/Users/user_name/Documents/csharpsdk-application";
SDKConfig config = new SDKConfig.Builder().SetAutoRefreshFields(true).Build();
DataCenter.Environment environment2 = EUDataCenter.PRODUCTION;
UserSignature user2 = new UserSignature("user2@zoho.eu");
Token token2 = new OAuthToken("clientId2", "clientSecret2", "REFRESH/GRANT token", TokenType.REFRESH, "redirectURL2");
Initializer.Initialize(user1, environment1, token1, tokenstore, config, resourcePath, logger);
MultiThread multiThread1 = new MultiThread(user1, environment1, token1, "Vendors");
Thread thread1 = new Thread(() => multiThread1.GetRecords());
thread1.Start();
MultiThread multiThread2 = new MultiThread(user2, environment2, token2, "Quotes");
Thread thread2 = new Thread(() => multiThread2.GetRecords());
thread2.Start();
thread1.Join();
thread2.Join();
}
public void GetRecords()
{
try
{
SDKConfig config = new SDKConfig.Builder().SetAutoRefreshFields(true).Build();
Initializer.SwitchUser(this.user, this.environment, this.token, config);
Console.WriteLine("Fetching records for user - " + Initializer.GetInitializer().User.Email);
RecordOperations recordOperation = new RecordOperations();
APIResponse<responsehandler> response = recordOperation.GetRecords(this.moduleAPIName, null, null);
if (response != null)
{
//Get the status code from response
Console.WriteLine("Status Code: " + response.StatusCode);
if (new List<int>() { 204, 304 }.Contains(response.StatusCode))
{
Console.WriteLine(response.StatusCode == 204 ? "No Content" : "Not Modified");
return;
}
//Check if expected response is received
if (response.IsExpected)
{
//Get object from response
ResponseHandler responseHandler = response.Object;
if (responseHandler is ResponseWrapper)
{
//Get the received ResponseWrapper instance
ResponseWrapper responseWrapper = (ResponseWrapper)responseHandler;
//Get the list of obtained Record instances
List<record> records = responseWrapper.Data;
foreach (Record record in records)
{
Console.WriteLine(JsonConvert.SerializeObject(record));
}
}
//Check if the request returned an exception
else if (responseHandler is APIException)
{
//Get the received APIException instance
APIException exception = (APIException)responseHandler;
//Get the Status
Console.WriteLine("Status: " + exception.Status.Value);
//Get the Code
Console.WriteLine("Code: " + exception.Code.Value);
Console.WriteLine("Details: ");
//Get the details map
foreach (KeyValuePair<string, object=""> entry in exception.Details)
{
//Get each value in the map
Console.WriteLine(entry.Key + ": " + JsonConvert.SerializeObject(entry.Value));
}
//Get the Message
Console.WriteLine("Message: " + exception.Message.Value);
}
}
}
}
catch (System.Exception ex)
{
Console.WriteLine(JsonConvert.SerializeObject(ex));
}
}
}
}
Multi-threading in a Single-user App
- The program execution starts from Main() where the SDK is initialized with the details of user and an instance of MultiThread class is created .
- When the Start() is called which in-turn invokes the run(), the moduleAPIName is switched through the method parameter. Therefore, this creates a thread for the particular method called with the MultiThread instance.
using System;
using System.Collections.Generic;
using System.Threading;
using Com.Zoho.API.Authenticator;
using Com.Zoho.API.Authenticator.Store;
using Com.Zoho.Crm.API;
using Com.Zoho.Crm.API.Dc;
using Com.Zoho.Crm.API.Logger;
using Com.Zoho.Crm.API.Record;
using Com.Zoho.Crm.API.Util;
using Newtonsoft.Json;
using static Com.Zoho.API.Authenticator.OAuthToken;
namespace csharpsdksampleapplication
{
public class MultiThread
{
static void Main(string[] args)
{
Logger logger = Logger.GetInstance(Logger.Levels.ALL, "/Users/user_name/Documents/csharp_sdk_log.log");
DataCenter.Environment env = USDataCenter.PRODUCTION;
UserSignature user = new UserSignature("user1@zoho.com");
TokenStore tokenstore = new FileStore("/Users/user_name/Documents/csharp_sdk_token.txt");
Token token = new OAuthToken("clientId", "clientSecret", "REFRESH/GRANT token", TokenType.REFRESH);
string resourcePath = "/Users/user_name/Documents/csharpsdk-application";
SDKConfig config = new SDKConfig.Builder().SetAutoRefreshFields(true).Build();
Initializer.Initialize(user, env, token, tokenstore, config, resourcePath, logger);
MultiThread multiThread1 = new MultiThread();
Thread thread1 = new Thread(() => multiThread1.GetRecords("Quotes"));
thread1.Start();
Thread thread2 = new Thread(() => multiThread1.GetRecords("Leads"));
thread2.Start();
thread1.Join();
thread2.Join();
}
public void GetRecords(string moduleAPIName)
{
try
{
Console.WriteLine("Fetching records for user - " + Initializer.GetInitializer().User.Email);
RecordOperations recordOperation = new RecordOperations();
APIResponse<responsehandler> response = recordOperation.GetRecords(moduleAPIName, null, null);
if (response != null)
{
//Get the status code from response
Console.WriteLine("Status Code: " + response.StatusCode);
if (new List<int>() { 204, 304 }.Contains(response.StatusCode))
{
Console.WriteLine(response.StatusCode == 204 ? "No Content" : "Not Modified");
return;
}
//Check if expected response is received
if (response.IsExpected)
{
//Get object from response
Com.Zoho.Crm.API.Record.ResponseHandler responseHandler = response.Object;
if (responseHandler is Com.Zoho.Crm.API.Record.ResponseWrapper)
{
//Get the received ResponseWrapper instance
Com.Zoho.Crm.API.Record.ResponseWrapper responseWrapper = (Com.Zoho.Crm.API.Record.ResponseWrapper)responseHandler;
//Get the list of obtained Record instances
List<com.zoho.crm.api.record.record> records = responseWrapper.Data;
foreach (Com.Zoho.Crm.API.Record.Record record in records)
{
Console.WriteLine(JsonConvert.SerializeObject(record));
}
}
//Check if the request returned an exception
else if (responseHandler is Com.Zoho.Crm.API.Record.APIException)
{
//Get the received APIException instance
APIException exception = (APIException)responseHandler;
//Get the Status
Console.WriteLine("Status: " + exception.Status.Value);
//Get the Code
Console.WriteLine("Code: " + exception.Code.Value);
Console.WriteLine("Details: ");
//Get the details map
foreach (KeyValuePair<string, object=""> entry in exception.Details)
{
//Get each value in the map
Console.WriteLine(entry.Key + ": " + JsonConvert.SerializeObject(entry.Value));
}
//Get the Message
Console.WriteLine("Message: " + exception.Message.Value);
}
}
}
}
catch (System.Exception ex)
{
Console.WriteLine(JsonConvert.SerializeObject(ex));
}
}
}
}
Single-threading in a Multi-user App
using System;
using System.Collections.Generic;
using System.Threading;
using Com.Zoho.API.Authenticator;
using Com.Zoho.API.Authenticator.Store;
using Com.Zoho.Crm.API;
using Com.Zoho.Crm.API.Dc;
using Com.Zoho.Crm.API.Logger;
using Com.Zoho.Crm.API.Record;
using Com.Zoho.Crm.API.Util;
using Newtonsoft.Json;
using static Com.Zoho.API.Authenticator.OAuthToken;
namespace csharpsdksampleapplication
{
public class MultiThread
{
DataCenter.Environment environment;
UserSignature user;
Token token;
string moduleAPIName;
public MultiThread(UserSignature user, DataCenter.Environment environment, Token token, string moduleAPIName)
{
this.environment = environment;
this.user = user;
this.token = token;
this.moduleAPIName = moduleAPIName;
}
static void Main(string[] args)
{
Logger logger = Logger.GetInstance(Logger.Levels.ALL, "/Users/user_name/Documents/csharp_sdk_log.log");
DataCenter.Environment environment1 = USDataCenter.PRODUCTION;
UserSignature user1 = new UserSignature("user1@zoho.com");
TokenStore tokenstore = new FileStore("/Users/user_name/Documents/csharp_sdk_token.txt");
Token token1 = new OAuthToken("clientId1", "clientSecret1", "REFRESH/GRANT token", TokenType.REFRESH, "redirectURL1");
string resourcePath = "/Users/user_name/Documents/csharpsdk-application";
SDKConfig config = new SDKConfig.Builder().SetAutoRefreshFields(true).Build();
DataCenter.Environment environment2 = EUDataCenter.PRODUCTION;
UserSignature user2 = new UserSignature("user2@zoho.eu");
Token token2 = new OAuthToken("clientId2", "clientSecret2", "REFRESH/GRANT token", TokenType.REFRESH, "redirectURL2");
Initializer.Initialize(user1, environment1, token1, tokenstore, config, resourcePath, logger);
MultiThread multiThread1 = new MultiThread(user1, environment1, token1, "Vendors");
Thread thread1 = new Thread(() => multiThread1.GetRecords());
thread1.Start();
MultiThread multiThread2 = new MultiThread(user2, environment2, token2, "Quotes");
Thread thread2 = new Thread(() => multiThread2.GetRecords());
thread2.Start();
thread1.Join();
thread2.Join();
}
public void GetRecords()
{
try
{
SDKConfig config = new SDKConfig.Builder().SetAutoRefreshFields(true).Build();
Initializer.SwitchUser(this.user, this.environment, this.token, config);
Console.WriteLine("Fetching records for user - " + Initializer.GetInitializer().User.Email);
RecordOperations recordOperation = new RecordOperations();
APIResponse<responsehandler> response = recordOperation.GetRecords(this.moduleAPIName, null, null);
if (response != null)
{
//Get the status code from response
Console.WriteLine("Status Code: " + response.StatusCode);
if (new List<int>() { 204, 304 }.Contains(response.StatusCode))
{
Console.WriteLine(response.StatusCode == 204 ? "No Content" : "Not Modified");
return;
}
//Check if expected response is received
if (response.IsExpected)
{
//Get object from response
ResponseHandler responseHandler = response.Object;
if (responseHandler is ResponseWrapper)
{
//Get the received ResponseWrapper instance
ResponseWrapper responseWrapper = (ResponseWrapper)responseHandler;
//Get the list of obtained Record instances
List< Com.Zoho.Crm.API.Record.Record> records = responseWrapper.Data;
foreach (Com.Zoho.Crm.API.Record.Record record in records)
{
Console.WriteLine(JsonConvert.SerializeObject(record));
}
}
//Check if the request returned an exception
else if (responseHandler is APIException)
{
//Get the received APIException instance
APIException exception = (APIException)responseHandler;
//Get the Status
Console.WriteLine("Status: " + exception.Status.Value);
//Get the Code
Console.WriteLine("Code: " + exception.Code.Value);
Console.WriteLine("Details: ");
//Get the details map
foreach (KeyValuePair<string,object> entry in exception.Details)
{
//Get each value in the map
Console.WriteLine(entry.Key + ": " + JsonConvert.SerializeObject(entry.Value));
}
//Get the Message
Console.WriteLine("Message: " + exception.Message.Value);
}
}
}
}
catch (System.Exception ex)
{
Console.WriteLine(JsonConvert.SerializeObject(ex));
}
}
}
}
</code></pre>
</div>
<h3>Single-threading in a Single-user App</h3>
<div>
<pre class="code-box2">
<button class="btn-pos" onclick="copyToClipboard(this,'init4')">Copy to Clipboard</button><code id="init4">using System;
using System.Collections.Generic;
using System.Threading;
using Com.Zoho.API.Authenticator;
using Com.Zoho.API.Authenticator.Store;
using Com.Zoho.Crm.API;
using Com.Zoho.Crm.API.Dc;
using Com.Zoho.Crm.API.Logger;
using Com.Zoho.Crm.API.Record;
using Com.Zoho.Crm.API.Util;
using Newtonsoft.Json;
using static Com.Zoho.API.Authenticator.OAuthToken;
namespace csharpsdksampleapplication
{
public class MultiThread
{
DataCenter.Environment environment;
UserSignature user;
Token token;
string moduleAPIName;
public MultiThread(UserSignature user, DataCenter.Environment environment, Token token, string moduleAPIName)
{
this.environment = environment;
this.user = user;
this.token = token;
this.moduleAPIName = moduleAPIName;
}
static void Main(string[] args)
{
Logger logger = Logger.GetInstance(Logger.Levels.ALL, "/Users/user_name/Documents/csharp_sdk_log.log");
DataCenter.Environment environment1 = USDataCenter.PRODUCTION;
UserSignature user1 = new UserSignature("user1@zoho.com");
TokenStore tokenstore = new FileStore("/Users/user_name/Documents/csharp_sdk_token.txt");
Token token1 = new OAuthToken("clientId1", "clientSecret1", "REFRESH/GRANT token", TokenType.REFRESH, "redirectURL1");
string resourcePath = "/Users/user_name/Documents/csharpsdk-application";
SDKConfig config = new SDKConfig.Builder().SetAutoRefreshFields(true).Build();
DataCenter.Environment environment2 = EUDataCenter.PRODUCTION;
UserSignature user2 = new UserSignature("user2@zoho.eu");
Token token2 = new OAuthToken("clientId2", "clientSecret2", "REFRESH/GRANT token", TokenType.REFRESH, "redirectURL2");
Initializer.Initialize(user1, environment1, token1, tokenstore, config, resourcePath, logger);
MultiThread multiThread1 = new MultiThread(user1, environment1, token1, "Vendors");
Thread thread1 = new Thread(() => multiThread1.GetRecords());
thread1.Start();
MultiThread multiThread2 = new MultiThread(user2, environment2, token2, "Quotes");
Thread thread2 = new Thread(() => multiThread2.GetRecords());
thread2.Start();
thread1.Join();
thread2.Join();
}
public void GetRecords()
{
try
{
SDKConfig config = new SDKConfig.Builder().SetAutoRefreshFields(true).Build();
Initializer.SwitchUser(this.user, this.environment, this.token, config);
Console.WriteLine("Fetching records for user - " + Initializer.GetInitializer().User.Email);
RecordOperations recordOperation = new RecordOperations();
APIResponse<responsehandler> response = recordOperation.GetRecords(this.moduleAPIName, null, null);
if (response != null)
{
//Get the status code from response
Console.WriteLine("Status Code: " + response.StatusCode);
if (new List<int>() { 204, 304 }.Contains(response.StatusCode))
{
Console.WriteLine(response.StatusCode == 204 ? "No Content" : "Not Modified");
return;
}
//Check if expected response is received
if (response.IsExpected)
{
//Get object from response
ResponseHandler responseHandler = response.Object;
if (responseHandler is ResponseWrapper)
{
//Get the received ResponseWrapper instance
ResponseWrapper responseWrapper = (ResponseWrapper)responseHandler;
//Get the list of obtained Record instances
List< Com.Zoho.Crm.API.Record.Record> records = responseWrapper.Data;
foreach (Com.Zoho.Crm.API.Record.Record record in records)
{
Console.WriteLine(JsonConvert.SerializeObject(record));
}
}
//Check if the request returned an exception
else if (responseHandler is APIException)
{
//Get the received APIException instance
APIException exception = (APIException)responseHandler;
//Get the Status
Console.WriteLine("Status: " + exception.Status.Value);
//Get the Code
Console.WriteLine("Code: " + exception.Code.Value);
Console.WriteLine("Details: ");
//Get the details map
foreach (KeyValuePair<string,object> entry in exception.Details)
{
//Get each value in the map
Console.WriteLine(entry.Key + ": " + JsonConvert.SerializeObject(entry.Value));
}
//Get the Message
Console.WriteLine("Message: " + exception.Message.Value);
}
}
}
}
catch (System.Exception ex)
{
Console.WriteLine(JsonConvert.SerializeObject(ex));
}
}
}
}